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

dotnet build /Users/dohertj2/Desktop/suitelinkclient/SuiteLink.Client.slnx -c Release

Test

Unit tests:

dotnet test /Users/dohertj2/Desktop/suitelinkclient/SuiteLink.Client.slnx -v minimal

Focused protocol tests:

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 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.
  • 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.
Description
No description provided
Readme 131 KiB
Languages
C# 100%