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 .
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.
def deps do
[
{ :ex_opcua , "~> 0.1.0" }
]
end
# 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 )
# 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.
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)
✔️
✔️
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
❌
❌
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.)
🚧
❌
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
❌
❌
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
✔️
🖧
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
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
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