Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ExOpcua

Pure Elixir implementation of OPC UA (Unified Architecture) — client and server. Zero native dependencies. Built against OPC UA v1.05.06 specifications with interop testing against open62541.

Features

  • Pure Elixir — no NIFs, no ports, no C dependencies
  • Client & Server — full session lifecycle on both sides
  • 437 generated types — 368 structured + 69 enumerated, compiled from the official BSD schema
  • 25 built-in types — spec-compliant binary encoding with property-based tests
  • 8 security policies — None, Basic256Sha256, Aes128_Sha256_RsaOaep, Aes256_Sha256_RsaPss, ECC_nistP256, ECC_nistP384, ECC_brainpoolP256r1, ECC_brainpoolP384r1
  • PubSub — UADP NetworkMessage encoding/decoding per Part 14 §7.2.2, interop tested over UDP multicast
  • Interop tested — Client & server tests against open62541 v1.5.2 (ci_server + custom C client), PubSub interop over UDP

Note: This project was AI-generated by feeding all OPC UA v1.05.06 specification documents into Claude and working through a comprehensive, spec-driven implementation plan. Every feature was implemented TDD against the specifications, with partial interop validation against open62541. Validation is ongoing work. Please refer to the implementation tables below.

Installation

def deps do
  [
    {:ex_opcua, "~> 0.1.0"}
  ]
end

Quick Start

Client

# Connect (unencrypted, anonymous)
{:ok, client} = ExOpcua.Client.Client.connect("opc.tcp://localhost:4840",
  security_policy: :none
)

# Browse the Root node
{:ok, refs} = ExOpcua.Client.Client.browse(client, %ExOpcua.Types.NodeId{
  namespace: 0, type: :numeric, value: 84
})

# Read a value
{:ok, [data_value]} = ExOpcua.Client.Client.read(client, %ExOpcua.Types.NodeId{
  namespace: 0, type: :numeric, value: 2258  # ServerStatus.CurrentTime
})

# Subscriptions
{:ok, mgr} = ExOpcua.Client.Client.start_subscriptions(client)
{:ok, sub_id} = ExOpcua.Client.Client.create_subscription(mgr, subscriber: self())
{:ok, _} = ExOpcua.Client.Client.create_monitored_items(mgr, sub_id, [
  %{node_id: %ExOpcua.Types.NodeId{namespace: 0, type: :numeric, value: 2258}}
])
# Receive: {:data_change, sub_id, handle, %DataValue{}}

ExOpcua.Client.Client.disconnect(client)

Server

# Build address space
as = ExOpcua.AddressSpace.new()
ExOpcua.AddressSpace.add_node(as, ExOpcua.AddressSpace.Node.variable(
  %ExOpcua.Types.NodeId{namespace: 2, type: :numeric, value: 1001},
  {2, "Temperature"},
  value: %ExOpcua.Types.Variant{type: :double, value: 23.5},
  data_type: %ExOpcua.Types.NodeId{namespace: 0, type: :numeric, value: 11},
  access_level: 3
))

# Start listener
{:ok, listener} = ExOpcua.Server.Listener.start_link(
  port: 4840,
  server_config: %{
    application_name: "MyServer",
    application_uri: "urn:my:server",
    product_uri: "urn:my:product",
    endpoint_url: "opc.tcp://localhost:4840",
    security_policies: [:none],
    user_token_policies: [:anonymous]
  },
  address_space: as,
  callback_module: MyCallbacks
)

Specification Compliance Tables

Implementation and interop test status for every OPC UA feature area. These tables serve as the project roadmap.

Implementation Legend

Symbol Meaning
✔️ Complete
🖥️ Client only
🖧 Server only
Not implemented
🚧 Partial / skeleton

Note: For interop, the symbol refers to the Elixir side tested against open62541.


Binary Encoding & Transport — Part 6

Spec Ref Feature Impl Interop
§5.1 UA Binary encoding — 25 built-in types ✔️ ✔️
§5.2.2 Primitive type encoding (Boolean, integers, float, double) ✔️ ✔️
§5.2.4 String / ByteString / XmlElement encoding ✔️ ✔️
§5.2.5 DateTime encoding (Windows FILETIME) ✔️ ✔️
§5.2.6 Guid encoding ✔️ ✔️
§5.2.7 NodeId encoding (TwoByte, FourByte, Numeric, String, Guid, Opaque) ✔️ ✔️
§5.2.8 ExpandedNodeId encoding ✔️ ✔️
§5.2.9 StatusCode encoding ✔️ ✔️
§5.2.10 DiagnosticInfo encoding (recursive nesting) ✔️ ✔️
§5.2.11 QualifiedName encoding ✔️ ✔️
§5.2.12 LocalizedText encoding ✔️ ✔️
§5.2.13 ExtensionObject encoding ✔️ ✔️
§5.2.14 Variant encoding (all type IDs) ✔️ ✔️
§5.2.15 DataValue encoding ✔️ ✔️
§5.2.16 Array encoding (length-prefixed, null) ✔️ ✔️
§5.3 Generated StructuredTypes from BSD schema (368 types) ✔️ ✔️
§5.3 Generated EnumeratedTypes from BSD schema (69 types) ✔️ ✔️
§6.7.1 HEL (Hello) message ✔️ ✔️
§6.7.1 ACK (Acknowledge) message ✔️ ✔️
§6.7.1 ERR (Error) message ✔️ ✔️
§6.7.1 RHE (ReverseHello) message ✔️ ✔️
§6.7.2 MessageChunk framing (OPN / MSG / CLO) ✔️ ✔️
§6.7.2 Asymmetric security header (OPN) ✔️ ✔️
§6.7.2 Symmetric security header (MSG/CLO) ✔️ ✔️
§6.7.2 Sequence header (sequence number, request ID) ✔️ ✔️
§6.7.3 Chunk splitting (outbound messages exceeding buffer) ✔️ ✔️
§6.7.3 Chunk assembly (multi-chunk inbound reassembly) ✔️ ✔️
§6.7.3 Abort chunk handling ✔️ ✔️
§6.7.1 TCP UA Connection Protocol (active :once, buffered reads) ✔️ ✔️

Security — Part 2 §4, Part 6 §6.7.4–6.8, Part 7

Spec Ref Feature Impl Interop
Part 7 §6.2.1 SecurityPolicy#None ✔️ ✔️
Part 7 §6.2.5 Basic256Sha256 (RSA-2048, SHA-256, AES-256-CBC) ✔️ ✔️
Part 7 §6.2.6 Aes128_Sha256_RsaOaep (RSA-2048, SHA-256, AES-128-CBC) ✔️ ✔️
Part 7 §6.2.7 Aes256_Sha256_RsaPss (RSA-2048, SHA-256, AES-256-CBC, PSS) ✔️ ✔️
Part 7 §6.2.8 ECC_nistP256 (ECDSA, ECDH, HKDF, AES-128-CBC) ✔️ ✔️
Part 7 §6.2.9 ECC_nistP384 (ECDSA, ECDH, HKDF, AES-256-CBC) ✔️ ✔️
Part 7 §6.2.10 ECC_brainpoolP256r1 (ECDSA, ECDH, HKDF, AES-128-CBC) ✔️ ✔️
Part 7 §6.2.11 ECC_brainpoolP384r1 (ECDSA, ECDH, HKDF, AES-256-CBC) ✔️ ✔️
Part 6 §6.1 X.509 v3 certificate generation (RSA 2048–4096, ECC P-256/P-384/brainpool) ✔️ ✔️
Part 6 §6.1 Certificate parsing (CN, public key, SAN/ApplicationURI) ✔️ ✔️
Part 6 §6.1 Certificate validation (trust chain, expiry) ✔️ ✔️
Part 6 §6.1 Certificate thumbprint (SHA-1) ✔️ ✔️
Part 6 §6.2.6 Certificate trust list (Agent-based, add/remove/reject) ✔️ ✔️
Part 6 §6.2.5 Certificate Revocation List (CRL) checking ✔️ ✔️
Part 6 §6.7.5 Asymmetric sign & encrypt (OPN — RSA + ECC sign-only) ✔️ ✔️
Part 6 §6.7.5 Symmetric sign & encrypt (MSG/CLO — RSA + ECC encrypt-then-MAC) ✔️ ✔️
Part 6 §6.7.5 P_SHA256 symmetric key derivation from nonces ✔️ ✔️
Part 6 §6.8.1 HKDF key derivation for ECC (RFC 5869) ✔️ ✔️
Part 6 §6.8.1 Per-message IV XOR (ECC profiles only, Table 68) ✔️ ✔️
Part 6 §6.7.5 Nonce exchange and validation ✔️ ✔️
Part 4 §5.5.2 Token renewal at 75% lifetime ✔️ ✔️
Part 6 §6.7.6 Sequence number validation (monotonic + wrap) ✔️ ✔️
Part 6 §6.7 RSA PKCS#1 v1.5 signing / verification ✔️ ✔️
Part 6 §6.7 RSA-PSS signing (Aes256_Sha256_RsaPss) ✔️ ✔️
Part 6 §6.7 RSA-OAEP encryption / decryption (SHA-1, SHA-256) ✔️ ✔️
Part 6 §6.7 AES-CBC encryption / decryption (128 & 256 bit) ✔️ ✔️
Part 6 §6.7 HMAC-SHA256 signing / verification ✔️ ✔️

Authentication — Part 4 §7.36

Spec Ref Feature Impl Interop
Part 4 §7.36.3 AnonymousIdentityToken (encoding ID 321) ✔️ ✔️
Part 4 §7.36.4 UserNameIdentityToken (encoding ID 324) ✔️ ✔️
Part 4 §7.36.5 X509IdentityToken (encoding ID 327) ✔️
Part 4 §7.36.6 IssuedIdentityToken (Kerberos/JWT)
Part 6 §6.5.2 JSON Web Token (JWT) UserIdentityToken
Part 6 §6.5.3 OAuth2 token flow (authorization code, refresh, client credentials)

Session & Connection — Part 4 §5.5–5.6

Spec Ref Feature Impl Interop
Part 4 §5.5.1 OpenSecureChannel / CloseSecureChannel ✔️ ✔️
Part 4 §5.5.2 SecurityToken renewal (OPN with RequestType=Renew) ✔️ 🖥️
Part 4 §5.6.2 CreateSession ✔️ ✔️
Part 4 §5.6.3 ActivateSession (with identity token) ✔️ ✔️
Part 4 §5.6.4 CloseSession ✔️ ✔️
Part 4 §5.6.5 Cancel (cancel outstanding requests)
Part 4 §5.6.3 Server signature verification (CreateSession) ✔️ 🖥️
Part 4 §5.6.3 Client signature computation (ActivateSession) ✔️ 🖥️
Session keepalive (periodic ServerStatus read) ✔️ 🖥️
Auto-reconnect with exponential backoff ✔️
Part 4 §5.6.3 Session activation gating (exempt service IDs) ✔️ 🖧
Part 4 §5.5 Secure channel ownership validation ✔️

Discovery Services — Part 4 §5.4, Part 12

Spec Ref Feature Impl Interop
Part 4 §5.4.2 FindServers ✔️ 🖥️
Part 4 §5.4.4 GetEndpoints ✔️ ✔️
Part 4 §5.4.5 Endpoint filtering by profileUris ✔️
Part 4 §5.4.5 EndpointDescription with UserTokenPolicies ✔️ ✔️
Part 12 §5.2 FindServersOnNetwork (mDNS)
Part 12 §5.3 RegisterServer / RegisterServer2
Part 12 Local Discovery Server (LDS)
Part 12 Global Discovery Server (GDS) 🚧
Part 12 GDS Certificate Manager 🚧

Browse Services — Part 4 §5.8

Spec Ref Feature Impl Interop
Part 4 §5.8.2 Browse (forward, inverse, both) ✔️ ✔️
Part 4 §5.8.2 Browse with reference type filter ✔️ ✔️
Part 4 §5.8.2 Browse with node class filter ✔️
Part 4 §5.8.2 Browse with includeSubtypes ✔️ ✔️
Part 4 §5.8.3 BrowseNext (continuation points) ✔️ 🖥️
Part 4 §5.8.4 TranslateBrowsePathsToNodeIds ✔️ ✔️
Part 4 §5.8.4 Multi-segment relative paths ✔️ 🖥️
Part 4 §5.8.5 RegisterNodes ✔️ ✔️
Part 4 §5.8.5 UnregisterNodes ✔️ ✔️

Attribute Services — Part 4 §5.10

Spec Ref Feature Impl Interop
Part 4 §5.10.2 Read (single node) ✔️ ✔️
Part 4 §5.10.2 Read (batch / multi-node) ✔️ 🖥️
Part 4 §5.10.2 Read with IndexRange (array subsets) ✔️ 🖥️
Part 4 §5.10.2 Read all 25 built-in data types ✔️ 🖥️
Part 4 §5.10.2 TimestampsToReturn handling ✔️
Part 4 §5.10.4 Write (single node) ✔️ ✔️
Part 4 §5.10.4 Write (batch / multi-node) ✔️
Part 4 §5.10.4 Write access level validation ✔️ 🖧
Part 4 §5.10.4 Write type checking ✔️ 🖧
Part 4 §5.10.2 Read of nonexistent node → BadNodeIdUnknown ✔️ ✔️
Part 4 §5.10.4 Write type mismatch → BadTypeMismatch ✔️ ✔️
Part 4 §5.10.4 Write access denied → BadNotWritable ✔️ 🖥️

Method Services — Part 4 §5.11

Spec Ref Feature Impl Interop
Part 4 §5.11.2 Call (invoke method on object) ✔️ ✔️
Part 4 §5.11.2 Input argument count validation ✔️ 🖧
Part 4 §5.11.2 Input argument type checking ✔️ 🖧
Part 4 §5.11.2 Output argument wrapping ✔️ ✔️
Part 4 §5.11.2 Call nonexistent method → BadMethodInvalid ✔️ 🖧
Part 4 §5.11.2 Call with wrong args → BadInvalidArgument ✔️ 🖧

Subscription Services — Part 4 §5.13

Spec Ref Feature Impl Interop
Part 4 §5.13.2 CreateSubscription ✔️ ✔️
Part 4 §5.13.3 ModifySubscription ✔️ 🖥️
Part 4 §5.13.4 SetPublishingMode ✔️ 🖥️
Part 4 §5.13.5 Publish (request/response with notifications) ✔️ ✔️
Part 4 §5.13.5 Publish — SubscriptionAcknowledgement (sequence tracking) ✔️
Part 4 §5.13.6 Republish ✔️ 🖥️
Part 4 §5.13.7 TransferSubscriptions ✔️
Part 4 §5.13.8 DeleteSubscriptions ✔️ ✔️
Part 4 Table 84 Publish state machine (Normal/Late/KeepAlive transitions) ✔️ ✔️
Part 4 §5.13.5 Publish request queuing (N outstanding) ✔️ ✔️
Part 4 §5.13.5 Keep-alive tracking (max keep-alive count) ✔️ ✔️
Part 4 §5.13.5 Notification retransmission queue ✔️

Monitored Item Services — Part 4 §5.12

Spec Ref Feature Impl Interop
Part 4 §5.12.2 CreateMonitoredItems ✔️ ✔️
Part 4 §5.12.3 ModifyMonitoredItems ✔️
Part 4 §5.12.4 SetMonitoringMode (disabled/sampling/reporting) ✔️ 🖥️
Part 4 §5.12.5 SetTriggering (triggering links) ✔️
Part 4 §5.12.6 DeleteMonitoredItems ✔️ 🖥️
Part 4 §5.12.2 DataChangeFilter ✔️
Part 4 §5.12.2 EventFilter (select_clauses + ContentFilter where_clause) ✔️
Part 4 §5.12.2 AggregateFilter (windowed sample accumulation) ✔️
Part 4 §5.12.2 Initial value sampling on creation ✔️
DataChangeNotification dispatch to subscribers ✔️ 🖥️
EventNotificationList dispatch ✔️
StatusChangeNotification dispatch ✔️
Part 4 §5.12.2 Monitor nonexistent node → BadNodeIdUnknown ✔️ 🖧

Node Management Services — Part 4 §5.7

Spec Ref Feature Impl Interop
Part 4 §5.7.2 AddNodes ✔️
Part 4 §5.7.3 AddReferences ✔️
Part 4 §5.7.4 DeleteNodes ✔️
Part 4 §5.7.5 DeleteReferences ✔️

Address Space Model — Part 3, Part 5

Spec Ref Feature Impl Interop
Part 3 §5.2 Object node class ✔️ ✔️
Part 3 §5.3 Variable node class ✔️ ✔️
Part 3 §5.4 Method node class ✔️ ✔️
Part 3 §5.5 ObjectType node class ✔️
Part 3 §5.6 VariableType node class ✔️
Part 3 §5.7 ReferenceType node class (with InverseName) ✔️ ✔️
Part 3 §5.8 DataType node class ✔️
Part 3 §5.9 View node class ✔️
Part 5 Standard namespace (ns=0) — Root, Objects, Types, Views, Server ✔️ ✔️
Part 5 NodeSet2.xml loading (4MB standard schema) ✔️
Part 5 ETS-backed node store (nodes table + references bag) ✔️ ✔️
Part 5 Bidirectional reference storage (auto forward + inverse) ✔️ ✔️
Part 5 Multiple namespace support (index-based) ✔️ ✔️

Data Access — Part 8

Spec Ref Feature Impl Interop
Part 8 §5.3 DataItemType (Definition, ValuePrecision) ✔️
Part 8 §5.3.2 AnalogItemType (EURange, InstrumentRange, EngineeringUnits) ✔️
Part 8 §5.3.3 DiscreteItemType (TwoState / MultiState) ✔️
Part 8 §5.3.4 ArrayItemType (spectrum/image data) ✔️
Part 8 §5.6.3 EUInformation (engineering units with SI support) ✔️

Alarms & Conditions — Part 9

Spec Ref Feature Impl Interop
Part 9 §5.5 ConditionType (activate, deactivate, acknowledge, confirm) ✔️
Part 9 §5.5 Condition branch support (branch_id, create_branch) ✔️
Part 9 §5.5 Condition retain flag ✔️
Part 9 §5.8.2 ExclusiveLevelAlarm (HighHigh/High/Low/LowLow) ✔️
Part 9 §5.8.3 NonExclusiveLevelAlarm (multiple active states) ✔️
Part 9 §5.8.8 RateOfChangeAlarm (dPV/dt with hysteresis) ✔️
Part 9 §5.8.5 DiscreteAlarm (binary/discrete state changes) ✔️
Part 9 §5.8.10 LatchingAlarm ✔️
Part 9 §5.8 Alarm evaluation engine (value → state transitions) ✔️
Part 9 §5.8.7 ExclusiveDeviationAlarm
Part 9 §5.8.9 NonExclusiveRateOfChangeAlarm
Part 9 §5.6 ShelvedStateMachineType (TimedShelve, OneShotShelve, Unshelve)
Part 9 §5.7 AckedConditionType / ConfirmedConditionType dialogs

Historical Access — Part 11

Spec Ref Feature Impl Interop
Part 11 §6.4 Pluggable HistoryBackend behaviour ✔️
Part 11 §6.4.2 ReadRawModifiedDetails (time-range query) ✔️
Part 11 §6.4.3 ReadProcessedDetails (with AggregateConfiguration) ✔️
Part 11 §6.4.4 ReadAtTimeDetails (values at specific timestamps) ✔️
Part 11 §6.4.5 ReadEventDetails (event history with filter) ✔️
Part 11 §6.4.2 ReadModifiedDetails (modification metadata) ✔️
Part 11 §6.5 HistoryUpdate — Insert ✔️
Part 11 §6.5 HistoryUpdate — Replace ✔️
Part 11 §6.5 HistoryUpdate — Delete (by range / at time) ✔️
Part 11 §6.4 History continuation points ✔️
Built-in in-memory / ETS history backend

Aggregates — Part 13

Spec Ref Feature Impl Interop
Part 13 §5.4 Interpolative aggregate
Part 13 §5.4 Average / TimeAverage / TimeAverage2
Part 13 §5.4 Total / TotalizeValue
Part 13 §5.4 Minimum / Maximum / MinimumActualTime / MaximumActualTime
Part 13 §5.4 Range / Count / DurationGood / DurationBad
Part 13 §5.4 NumberOfTransitions / Start / End / Delta / DeltaBounds
Part 13 §5.4 PercentGood / PercentBad / WorstQuality
Part 13 §5.4 StandardDeviationSample / StandardDeviationPopulation / Variance
Part 13 §5.4 RegSlope / RegConst / RegDeviation / RegStdDev
Part 13 §5.3 AggregateConfiguration (stepping, percentDataBad, etc.) 🚧

PubSub — Part 14

Spec Ref Feature Impl Interop
Part 14 §7.2.2 UADP NetworkMessage encoding/decoding ✔️ ✔️
Part 14 §7.2.2 UADP GroupHeader (all optional fields) ✔️ ✔️
Part 14 §7.2.2 UADP DataSetMessage (KeyFrame/DeltaFrame/Event) ✔️ ✔️
Part 14 §7.2.2 UADP ExtendedFlags1/2 (Timestamp, PicoSeconds) ✔️ ✔️
Part 14 §7.2.2 UADP PayloadHeader (DataSetWriterIds) ✔️ ✔️
Part 14 §7.2.2 UADP PublisherId (Byte/UInt16/UInt32/UInt64/String) ✔️ ✔️
Part 14 §7.2.2 UADP field encodings (Variant/RawData/DataValue) ✔️ ✔️
Part 14 §7.3 JSON NetworkMessage encoding
Part 14 §8.2 UDP multicast transport (UADP over UDP) ✔️ ✔️
Part 14 §8.3 MQTT transport 🚧
Part 14 §8.4 AMQP transport
Part 14 §6.2 PublishedDataSet / DataSetWriter ✔️ ✔️
Part 14 §6.2 DataSetReader / SubscribedDataSet ✔️ ✔️
Part 14 §6.2 WriterGroup / ReaderGroup ✔️ ✔️
Part 14 §6.2 PubSubConnection management
Part 14 §7.2.2 UADP message security (signing/encryption)
Part 14 §7.2.2 UADP publisher/subscriber key exchange
Part 14 §6.4 DataSetMetaData management
Part 14 §6.2.9 PubSub diagnostics

Query Services — Part 4 §5.9

Spec Ref Feature Impl Interop
Part 4 §5.9.2 QueryFirst
Part 4 §5.9.3 QueryNext

Server Features

Spec Ref Feature Impl Interop
ThousandIsland TCP listener ✔️ ✔️
Per-connection :gen_statem handler ✔️ ✔️
Service dispatcher with session gating ✔️ 🖧
ETS-backed session manager (create/activate/expire) ✔️ ✔️
Subscription engine (pure data structure) ✔️ 🖧
Pluggable callback behaviour (handle_call, etc.) ✔️ 🖧
Dynamic port binding (port 0) ✔️ ✔️
Part 4 §5.6.2 Server nonce generation ✔️ 🖧
Part 4 §5.6.2 Server endpoints in CreateSession response ✔️ 🖧

Interop Test Summary

All interop tests run against open62541 v1.5.2 (OPC Foundation certified). Requires Docker.

Suite Tests Description
Client vs ci_server 30 Our client against open62541's example server (incl. encrypted + username auth)
interop_client vs our server 1 (21 checks) open62541's C client exercises all services against our server
Encrypted client vs our server 1 (21 checks) open62541's C client with Basic256Sha256 against our server (asymmetric header)
Self-interop publish 5 Our client vs our server — publish state machine (Part 4, Table 79)
Self-interop ECC 4 Our client vs our server — ECC_nistP256 and ECC_nistP384 (connect, read, write, browse)
Security self-interop 14 Aes128/Aes256_RsaPss/brainpool policies, trust list, CRL, token renewal, cert features
Security vs open62541 5 Aes128 + Aes256_RsaPss against ci_server, cert parsing, token renewal over encrypted
open62541 vs server (Aes128/PSS) 2 (21 checks) open62541 client with Aes128_Sha256_RsaOaep and Aes256_Sha256_RsaPss against our server
Transport self-interop 10 ERR, RHE, abort chunks, chunk splitting/assembly, Guid, DiagnosticInfo
Transport vs open62541 4 ERR handling and large responses against open62541 ci_server
PubSub interop 3 UADP encode/decode over UDP multicast against open62541 publisher/subscriber
# Build the interop Docker image
docker build -t ex_opcua_interop -f test/interop/Dockerfile.open62541 test/interop/

# Run all tests including interop
mix test --include interop

Architecture

  • State machines: Raw :gen_statem (no wrapper libraries)
  • Storage: ETS for address space, sessions, subscriptions
  • Encoding: All types return iodata (encode) and {:ok, value, rest} (decode)
  • Error handling: {:ok, result} / {:error, reason} tuples; batch ops have per-item StatusCode
  • Dependencies: Minimal — only ThousandIsland (TCP server)
  • Code generation: 437 type modules generated at compile time from the official OPC Foundation BSD schema

Spec References

All implementation targets OPC UA v1.05.06:

Document Content
Part 1 Overview and Concepts
Part 2 Security Model
Part 3 Address Space Model
Part 4 Services
Part 5 Information Model
Part 6 Mappings (binary encoding, transport, security)
Part 7 Profiles (security policies, conformance units)
Part 8 Data Access
Part 9 Alarms and Conditions
Part 10 Programs
Part 11 Historical Access
Part 12 Discovery and Global Services
Part 13 Aggregates
Part 14 PubSub

About

Pure Elixir client and server implementation of OPC UA

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Sponsor this project

Contributors

Languages