983f02921c
rust / build / test / clippy / fmt (push) Has been cancelled
Extends the example to exercise the full data-plane through the
new canonical-XML signing path (F28 step 2). Each op is announced
with a "[canonical XML <Op>]" tag in the trace so the lifecycle is
self-documenting:
Connect → Register → Read → Write → CreateSubscription
→ AddMonitoredItems → Publish × N → PublishWriteComplete
→ DeleteMonitoredItems → DeleteSubscription
→ UnregisterItems → Disconnect → SendEnd
Per-section errors are caught and logged but don't abort the
lifecycle — a failed Publish still reaches Disconnect cleanly so
the server-side pending-connection table doesn't fill up.
New env vars MX_RUN_WRITE / MX_RUN_SUBSCRIBE / MX_SUBSCRIBE_COUNT
(defaults: run, run, 3) for opting into / sizing the optional steps.
Live verification on this host (this turn, first run):
register status: 1 item(s); result_code=Some(0) success=Some(true)
TestChildObject.TestInt = AsbVariant{type_id:4,length:4,payload:[99]}
write status: 0 item(s); result_code=Some(0) success=Some(true)
subscription_id=2 result_code=Some(0) success=Some(true)
add status: 0 item(s); result_code=Some(0) success=Some(true)
publish: 0 value(s); result_code=Some(32) success=Some(false)
publish_write_complete: 0 write(s); result_code=Some(0)
delete_monitored_items ok
delete_subscription ok
unregistering ... disconnecting
All 13 canonical-XML-signed ops accepted by MxDataProvider — no SOAP
faults, no HMAC rejections, no decode errors. F28 step 2 verified
end-to-end against the live AVEVA install.
Bonus fix: F26 stream's publish_loop bail logic narrowed.
The original F33 bail-on-any-non-zero-result_code was over-aggressive:
.NET's MxAsbClient.Probe shows that result_code=32 (= 0x20) fires on
*every* Publish poll while values are still being delivered. Updated
publish_loop and the example's Publish loop to bail only on
RESULT_CODE_INVALID_CONNECTION_ID (1) — that one truly means the
session is desynced. Other non-zero result_codes are informational
and the loop continues draining.
New public re-export: mxaccess_asb::RESULT_CODE_INVALID_CONNECTION_ID
(was crate-private under the operations module).
The InvalidConnectionId transient still hits after many back-to-back
test runs against a long-running MxDataProvider — the pending-
connection table fills up — same well-documented behaviour from F32.
A 30-second cool-down restores reliability in our experience.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
47 lines
2.3 KiB
Rust
47 lines
2.3 KiB
Rust
//! `mxaccess-asb` — `IASBIDataV2` client.
|
|
//!
|
|
//! M5 work-in-progress (F25). The first slice of F25 — SOAP-1.2-over-NBFX
|
|
//! envelope assembly + action constants for the full `IASBIDataV2`
|
|
//! contract — lives in [`envelope`]. Per-operation request/response
|
|
//! struct codecs and the network-bound `AsbClient` (TCP + NMF preamble +
|
|
//! sized-envelope read/write loop + auth handshake) land in subsequent
|
|
//! F25 iterations.
|
|
|
|
#![forbid(unsafe_code)]
|
|
|
|
pub mod client;
|
|
pub mod contracts;
|
|
pub mod envelope;
|
|
pub mod operations;
|
|
pub mod xml_canonical;
|
|
|
|
pub use client::{AsbClient, ClientError, PreambleMode};
|
|
|
|
pub use contracts::{
|
|
ItemIdentity, ItemIdentityType, ItemReferenceType, ItemStatus, MonitoredItemValue,
|
|
decode_item_identity_array, decode_item_status_array, decode_monitored_item_value_array,
|
|
encode_item_identity_array, encode_item_status_array, encode_monitored_item_value_array,
|
|
};
|
|
pub use envelope::{
|
|
ConnectionValidator, DecodedEnvelope, EnvelopeError, SoapEnvelope, actions, decode_envelope,
|
|
encode_envelope,
|
|
};
|
|
pub use operations::{
|
|
AddMonitoredItemsResponse, AuthenticationDataBytes, ConnectResponse,
|
|
CreateSubscriptionResponse, DeleteMonitoredItemsResponse, DeleteSubscriptionResponse,
|
|
MinimalMonitoredItem, MinimalWriteValue, OperationError, PublishResponse,
|
|
PublishWriteCompleteResponse, ReadResponse, RegisterItemsResponse,
|
|
RESULT_CODE_INVALID_CONNECTION_ID, UnregisterItemsResponse,
|
|
WriteResponse, build_add_monitored_items_request_body, build_authenticate_me_request_body,
|
|
build_connect_request_body, build_create_subscription_request_body,
|
|
build_delete_monitored_items_request_body, build_delete_subscription_request_body,
|
|
build_disconnect_request_body, build_keep_alive_request_body, build_publish_request_body,
|
|
build_publish_write_complete_request_body, build_read_request_body,
|
|
build_register_items_request_body, build_unregister_items_request_body,
|
|
build_write_request_body, collect_asbidata_payloads, decode_add_monitored_items_response,
|
|
decode_connect_response, decode_create_subscription_response,
|
|
decode_delete_monitored_items_response, decode_publish_response,
|
|
decode_publish_write_complete_response, decode_read_response, decode_register_items_response,
|
|
decode_unregister_items_response, decode_write_response,
|
|
};
|