# SuiteLink Client Cross-platform `.NET 10` C# client for AVEVA SuiteLink tag operations. ## Scope Current implementation targets the normal SuiteLink tag protocol and supports: - startup handshake and connect message encoding - subscribe and unadvise flows - update decoding for `bool`, `int32`, `float32`, and `string` - write (`POKE`) encoding for `bool`, `int32`, `float32`, and `string` - background receive loop for subscription updates without manual polling - automatic reconnect with durable subscription replay after runtime disconnects - best-effort latest-value catch-up replay after reconnect when enabled - policy-based reconnect retry timing with exponential backoff and jitter support - client/session/transport layers suitable for macOS, Linux, and Windows ## Unsupported This repository does not currently support: - AlarmMgr / alarms and events - secure SuiteLink V3 / TLS transport - write queuing while reconnecting - full outage-history replay of every missed value - validated reconnect behavior against a live AVEVA server deployment - validated support for richer System Platform data types such as `double`, `int64`, or `DateTime` ## Build ```bash dotnet build /Users/dohertj2/Desktop/suitelinkclient/SuiteLink.Client.slnx -c Release ``` ## Test Unit tests: ```bash dotnet test /Users/dohertj2/Desktop/suitelinkclient/SuiteLink.Client.slnx -v minimal ``` Focused protocol tests: ```bash dotnet test /Users/dohertj2/Desktop/suitelinkclient/SuiteLink.Client.slnx --filter Protocol -v minimal ``` ## Integration Live integration tests are safe by default and only run when explicitly enabled with environment variables. See [README.md](/Users/dohertj2/Desktop/suitelinkclient/tests/SuiteLink.Client.IntegrationTests/README.md) for: - required environment variables - tag configuration - enabling live round-trip tests for `bool`, `int`, `float`, and `string` ## Notes - The repository includes fixture-backed protocol tests under [Fixtures](/Users/dohertj2/Desktop/suitelinkclient/tests/SuiteLink.Client.Tests/Fixtures). - Protocol assumptions derived from reverse engineering are intentionally isolated in codec classes and tests so they can be refined against live captures later. - Normal subscription use does not require calling `ProcessIncomingAsync`; the runtime loop dispatches updates in the background. - After a runtime disconnect, the client enters `Reconnecting`, rebuilds the transport/session startup sequence, replays durable subscriptions, and resumes dispatch without caller resubscription. - Reconnect timing is driven by `SuiteLinkRetryPolicy`; the default policy retries immediately, then uses bounded exponential backoff with jitter. - Catch-up replay is best-effort latest-value refresh only. It does not represent every value missed during the outage window. - If the client is reconnecting after a runtime disconnect, `WriteAsync` fails fast until the session is ready again. - Reconnect behavior is currently verified with fixture-backed and fake-transport tests; live AVEVA validation is still required, especially for mixed-mode deployments and server-specific timing.