Skip to content
← Blog

The industrial protocol stack landscape

Who implements Modbus, OPC UA, BACnet, IEC 104, IEC 61850, Siemens S7, OpenADR, OCPP, DNP3 and IEEE 2030.5? 134 open-source and commercial stacks, verified against their own release channels, and an interactive map to explore them.

The OT protocol ecosystem map, with a protocol in the middle and its implementations branching out by type

Nobody connects a plant, a substation or a building with one library. Every integration leans on stacks written by other people: a C library in a gateway, a Python tool on a laptop, a Java server in a SCADA system, a vendor SDK inside a controller. OT Fabric only makes sense as part of that ecosystem, which is why each of our protocols ships with an interop suite that tests against the established implementations.

So we mapped the ecosystem. This post is the research: ten protocol families, 134 implementations, and what we learned checking every one of them against its own release channel. The interactive version lets you pick a protocol, filter by language, licence and activity, and jump straight to the source.

134 implementations · 10 protocolsExplore the interactive ecosystem mapFilter by language, licence and activity, then jump straight to the source.

How we counted

We sort every implementation into one of four groups, because a flat list of repositories hides how the ecosystem actually fits together:

  • Independent stacks handle the protocol themselves.
  • Derived libraries and bindings wrap, port or extend another stack. They link to their upstream instead of counting as a new engine.
  • Commercial SDKs are proprietary or dual-licensed developer libraries, including those without public source.
  • Legacy and reference code is historically important but superseded or no longer maintained.

Each entry records its language, licence (as an SPDX expression, read from the licence file, or the licence’s own name where it has no SPDX identifier), protocol roles, documented capabilities, latest release, last commit, stars and forks, and the OT Fabric interop suite that exercises it, if any. Every entry also lists its sources and the date we last verified it.

GitHub Releases are the wrong place to look

The first draft of this inventory took versions from GitHub Releases. Checking each project against the channel it actually publishes to changed a third of the version column:

  • NModbus has no GitHub Release objects, but publishes 3.0.83 on NuGet (April 2026).
  • jsmodbus shows v2.0.1 as its GitHub Release; npm has 5.0.0, published in September 2026.
  • Modbus4J is at tag v3.1.0, ahead of its old 2.x GitHub Release.
  • BACnet Stack releases on SourceForge (1.6.1, August 2026), not as GitHub Releases. The project dates back to 2004; the GitHub repository only to 2019.
  • BACpypes3 is at 0.0.110 on PyPI and System.IO.BACnet at 4.0.0 on NuGet. Its MIT licence, unclear in the first pass, is confirmed.
  • tokio-modbus (0.17.0), simonvetter/modbus (v1.6.4) and NModbus tag and publish without creating GitHub Releases.
  • The EPRI OpenADR reference code is BSD-3-Clause throughout; two licences had been left open.

The registry now names the source of every version: GitHub, PyPI, npm, crates.io, NuGet, Maven Central, pub.dev, SourceForge, the Go module proxy or a vendor’s release notes.

Modbus

Very mature. The broadest open-source ecosystem in OT, from microcontrollers to cloud services. Modbus TCP versus serial is a capability, not a separate implementation, and so is client-only versus client and server.

ImplementationLanguageLicenceLatest releaseStarsType
libmodbusCLGPL-2.1-or-laterv3.2.0 Jul 20264.3kIndependent
PyModbusPythonBSD-3-Clause3.16.1 Oct 20262.8kIndependent
NModbusC#MIT3.0.83 Apr 20261.1kIndependent
goburrow/modbusGoBSD-3-Clausev0.1.0 Sept 20181kIndependent · quiet
Modbus4JJavaGPL-3.0 or commercialv3.1.0 Jan 20221kIndependent · slowing
modbus-serialJavaScriptISC8.0.25 Mar 2026731Independent
ModbusMasterC++ (Arduino)Apache-2.0v2.0.1 Sept 2016651Independent · quiet
modbus-esp8266C++ (Arduino)BSD-3-Clause4.1.1 Jan 2023628Independent · slowing
jsmodbus (node-modbus)JavaScriptMIT5.0.0 Sept 2026512Independent
simonvetter/modbusGoMITv1.6.4 Nov 2025455Independent
j2modJavaApache-2.03.4.0 Sept 2026337Independent
tokio-modbusRustMIT OR Apache-2.00.17.0 Oct 2025567Independent
digitalpetri/modbusJavaEPL-2.02.1.6 Aug 2026863Independent
go-modbusGoMITv1.7.1 Oct 20262Independent

libmodbus, PyModbus, NModbus, digitalpetri/modbus and tokio-modbus are the reference implementations in our modbus-interop suite. goburrow/modbus and ModbusMaster are still widely used but have not changed since 2016 to 2018. On the commercial side, Triangle MicroWorks sells Modbus source libraries, and Modbus4J is dual-licensed by Radix IoT.

OPC UA

Very mature, with a strong commercial market. OPC UA lets you compare independent open source, foundation-backed code and proprietary SDKs side by side. Client/server and PubSub are separate capabilities, and no stack covers every security profile, transport and information model.

ImplementationLanguageLicenceLatest releaseStarsType
open62541CMPL-2.0v1.5.9 Oct 20263.3kIndependent
OPC Foundation UA-.NETStandardC#OPC Foundation MIT2.0.1 Oct 20262.4kIndependent
node-opcuaTypeScriptMIT2.187.9 Oct 20261.7kIndependent
opcua-asyncio (asyncua)PythonLGPL-3.02.1.0 Oct 20261.5kIndependent
Eclipse MiloJavaEPL-2.0v1.1.8 Oct 20261.4kIndependent
async-opcuaRustMPL-2.00.19.0 Jul 2026163Independent
gopcua/opcuaGoMITv0.9.1 Aug 20261.1kIndependent
go-opcuaGoMITv1.6.0 Oct 20260Independent
python-opcuaPythonLGPL-3.00.98.13 Mar 20211.5kLegacy · deprecated
locka99/opcuaRustMPL-2.00.12.0 Jan 2024576Legacy · slowing

open62541, Eclipse Milo, the OPC Foundation .NET stack, node-opcua and the FreeOpcUa family are the essential open-source references. Two lineages are worth knowing: python-opcua is deprecated in favour of opcua-asyncio, and the Rust code base started by locka99/opcua continues as async-opcua. Unified Automation, Prosys and Softing are the established commercial SDK vendors. OpenOpcUa CoreServer, the native C/C++ runtime behind 4CE Industry’s OOUAMiddleware, takes another route: closed source, but free to deploy without licensing fees.

134 implementations · 10 protocolsSee the OPC UA lineages on the mapFilter by language, licence and activity, then jump straight to the source.

BACnet

Mature, but fragmented. BACnet/IP, MS/TP, BACnet/SC and the device profiles make very different demands, so “BACnet supported” on its own says very little. The map records which data links each stack documents.

ImplementationLanguageLicenceLatest releaseStarsType
BACnet StackCGPL-2.0-or-later WITH GCC-exception-2.01.6.1 Aug 2026602Independent
BACpypes3PythonMIT0.0.110 Sept 202699Independent
System.IO.BACnetC#MIT4.0.0 Jul 2026251Independent
BACnet4JJavaGPL-3.0 or commercialv6.1.0 Mar 2026221Independent
ulbios/bacnetGoMITuntagged22Independent · quiet
@bacnet-js/clientTypeScriptMIT3.3.2 May 202620Independent
worldiety/bacnetGoBSD-2-Clauseuntagged0Independent
go-bacnetGoMITv0.4.0 Oct 20260Independent
@bacnet-js/deviceTypeScriptMIT0.8.0 Jun 20264Derived
BACpypesPythonMIT0.19.0 Jan 2025328Legacy

BACnet Stack stands out: extensive service coverage, embedded targets, and a GPL linking exception that lets proprietary products link it. BACpypes3, BACnet4J and System.IO.BACnet (the stack behind YABE) complete the reference set, and all four run in bacnet-interop. BACpypes3 now also ships an MCP server, so AI agents can talk BACnet. Cimetrics, PolarSoft and SoftDEL lead the commercial SDK market.

IEC 60870-5-104

Specialized. A handful of credible engines, with bindings and forks built on top of them, which is exactly where the relationships matter.

ImplementationLanguageLicenceLatest releaseStarsType
lib60870CGPL-3.0 or commercialv2.4.1 Jul 2026602Independent
OpenMUC j60870JavaGPL-3.0 or commercial1.8.0 Jul 2026–Independent
go-iecp5 (thinkgos)GoLGPL-3.0v1.2.1 May 2022101Independent · archived
go-iec104GoMITv0.0.3 Oct 20261Independent
go-iecp5 (riclolsen)GoLGPL-3.0v0.4.6 Sept 20263Derived
go-iecp5 (wendy512)GoLGPL-3.0v1.2.6 Feb 20267Derived
wendy512/iec104GoApache-2.0v1.0.4 Feb 2026110Derived
iec104-python (c104)Python / C++GPL-3.02.2.1 Apr 2025103Derived

The independent engines are lib60870, OpenMUC j60870 and go-iecp5. The Python package c104 binds lib60870; wendy512/iec104 builds on a go-iecp5 fork. The original go-iecp5 was archived in March 2023 and lives on in two maintained forks. j60870 is distributed through OpenMUC and Maven Central (1.8.0) rather than a GitHub repository. MZ Automation, OpenMUC and Triangle MicroWorks offer commercial licences.

IEC 61850 and MMS

Specialized, with few comprehensive implementations. IEC 61850 is not just MMS: it adds information models, GOOSE, Sampled Values and SCL. A stack that only speaks MMS is not an IEC 61850 stack.

ImplementationLanguageLicenceLatest releaseStarsType
libiec61850CGPL-3.0 or commercialv1.6.2.1 Sept 20261.2kIndependent
IEC61850beanJavaApache-2.01.9.0 Jun 2020186Independent · quiet
dscsystems/go-iec61850GoGPL-3.0v0.6.4 Oct 20263Independent
go-iec61850GoMITv1.0.8 Jul 20260Independent
go-mmsGoMITv1.0.7 Jul 20260Derived

libiec61850 is the dominant open-source reference: MMS client and server, GOOSE, Sampled Values, reports, datasets, logging, file services and TLS, with commercial licences from MZ Automation. IEC61850bean (formerly OpenIEC61850) is an established Java MMS implementation, quiet since 2023. dscsystems/go-iec61850 is three months old and worth watching.

Siemens S7

Mature for classic S7comm, constrained beyond it. Talking to an S7-300 over ISO-on-TCP is not the same as talking to an S7-1500 with optimized data blocks and access protection. S7comm and S7commPlus are separate branches on the map.

ImplementationLanguageLicenceLatest releaseStarsType
Apache PLC4XJava, Go, CApache-2.01.0.0 Sept 20261.8kIndependent
S7NetPlusC#MIT0.20.0 Aug 20231.6kIndependent · quiet
python-snap7PythonMIT3.2.1 Oct 2026858Independent
gos7GoBSD-3-Clauseuntagged405Independent
nodeS7JavaScriptMIT0.3.18 Jul 2022399Independent · quiet
Snap7C++LGPL-3.01.4.3 SourceForge–Independent
s7commplusPythonMIT0.2.0 Oct 202610Independent
go-s7commGoMITv0.7.5 Jul 20260Independent
Sharp7C#MIT1.1.84 May 2023258Derived · quiet

Snap7 is distributed on SourceForge; the popular GitHub repository under SCADACS is a fork with server extensions, not the canonical source. python-snap7 is no longer a wrapper: since 3.0 (March 2026) it implements TPKT, COTP and S7 natively in Python. Apache PLC4X counts stars for its whole multi-protocol framework. The new s7commplus project opens the S7-1200/1500 branch. Softing siAccess, successor to ACCON-AGLink, and PLCcom for S7 are the commercial options.

OpenADR

Smaller and still evolving. OpenADR 2.0b and 3.x are different technologies, and 3.1 is not backward-compatible with 3.0, so the map separates versions and roles: VEN, VTN and business logic.

ImplementationLanguageLicenceLatest releaseStarsType
OpenLEADR (Python)PythonApache-2.00.5.36 Sept 2026159Independent
OpenLEADR (Rust)RustMIT OR Apache-2.00.2.7 Oct 2026104Independent
ElaadNL openadr3-clientPythonApache-2.02.4.0 Aug 20265Independent
avob/OpenADRJavaApache-2.0untagged58Independent · quiet
go-openadrGoMITv0.4.0 Oct 20260Independent
EPRI OpenADR Virtual Top NodeRubyBSD-3-Clausev0.9.7 Jan 201751Legacy · discontinued
EPRI OpenADR Virtual End NodeC#BSD-3-Clausev0.7 Aug 201643Legacy · quiet
EPRI OpenADR VEN LibraryC++BSD-3-Clausev0.7.0 Aug 201621Legacy · quiet

OpenLEADR covers both generations: Python for 2.0b, Rust for 3.1, where its README is upfront that subscriptions (webhooks) are not supported yet. ElaadNL’s openadr3-client comes from an organization that builds EV charging infrastructure. The EPRI projects are legacy references; EPRI has discontinued support. The OpenADR Alliance’s reference implementation is not publicly available, so it is not on the map, and we found no standalone commercial OpenADR SDKs comparable to other protocols. That branch stays open for verified submissions.

OCPP

Mature for 1.6J, maturing for 2.x. OCPP 2.0.1 is not backward-compatible with 1.6, while 2.1 extends 2.0.1, so a claim of “OCPP support” says little without the version. The map lists versions and roles: the charging station and the CSMS.

ImplementationLanguageLicenceLatest releaseStarsType
ocpp (The Mobility House)PythonMIT2.1.0 Jul 20251kIndependent
Java-OCA-OCPP (ChargeTime)JavaMIT2.0 Dec 2025380Independent
ocpp-goGoMITv0.19.0 Feb 2025377Independent · slowing
libocpp (EVerest)C++Apache-2.0v0.31.1 Dec 2025151Independent · archived
CitrineOSTypeScriptApache-2.0v2.0.1 Oct 2026299Independent
EVerestC++Apache-2.02026.02.1 Jul 2026282Independent
SteVeJavaGPL-3.0-or-latersteve-3.14.1 Aug 20261.1kIndependent
MicroOcppC++MITv1.2.0 Nov 2024548Independent
rust-ocppRustMIT OR Apache-2.03.0.4 Nov 2025105Independent
ocpp-rpcJavaScriptMIT2.2.1 Jul 2025136Independent
OCPP.CoreC#GPL-3.0V1.8.0 Oct 2026306Independent
Open OCPPC++LGPL-2.1v1.6.0 Jun 2025175Independent
OpenOCPP (ChargeLab)C++Apache-2.0v1.0.0 Jun 202590Independent
ocpp-toolkit (IZIVIA)KotlinMIT3.0.0 Sept 202646Independent
WWCP_OCPP (Open Charging Cloud)C#AGPL-3.0untagged71Independent
library-ocpp (Monta)KotlinApache-2.0v3.0.2 Sept 20266Independent
e-mobility charging stations simulator (SAP)TypeScriptApache-2.0v4.12.0 Aug 2026229Independent
go-ocppGoMITv0.1.3 Oct 20260Independent
Home Assistant OCPP integrationPythonMITv0.12.1 Oct 2026407Derived
Open e-Mobility (ev-server)TypeScriptApache-2.0V2.7.8 May 2023176Legacy · archived
NewMotion OCPP (Scala)ScalaGPL-3.0v9.2.3 Jan 2020212Legacy · archived
MotownJavaApache-2.00.14.0 Feb 201944Legacy · quiet

The open-source side is broad, with libraries in Python, Java, Go, C++, Rust, JavaScript, C# and Kotlin. Five of them run in ocpp-interop: The Mobility House ocpp, ChargeTimeEU Java-OCA-OCPP, ocpp-go, EVerest libocpp and CitrineOS. libocpp’s own repository is archived; it now lives inside EVerest, the LF Energy charging station stack. SteVe and OCPP.Core are complete CSMS products rather than libraries, and MicroOcpp brings the station side to microcontrollers. Commercial stacks are sold for both sides, though versions and platforms are rarely published.

DNP3

Mature, with few active open stacks. DNP3 (IEEE 1815) has been the SCADA protocol of North American utilities for three decades, and the commercial side is well established: source code libraries from Triangle MicroWorks, FreyrSCADA and others run inside many RTUs and IEDs. The open-source side has thinned out.

ImplementationLanguageLicenceLatest releaseStarsType
dnp3 (Step Function I/O)Rust, C, C++, C#, JavaNon-commercial (Step Function I/O) or commercial1.7.0 Sept 2026159Independent
opendnp3C++, Java, C#Apache-2.03.1.2 Apr 2022336Independent · archived
go-dnp3 (DSC Systems)GoGPL-3.0-or-laterv0.8.1 Oct 20262Independent
dnp3pyPythonMIT0.6.0 Sept 202610Independent
dnp3 (cB-Sigma)GoApache-2.0v0.3.0 Oct 20260Independent
nfm-dnp3PythonMIT1.0.1 Feb 20260Independent
go-dnp3GoMITv1.3.1 Oct 20260Independent
yadnp3C++, PythonApache-2.03.2.1.4 Oct 20260Derived
pydnp3PythonApache-2.00.1.0 Jun 201837Derived · quiet
dnp3-python (VOLTTRON)PythonApache-2.0untagged20Derived · slowing
dnp3 (Dart and Flutter)DartMIT0.3.2 Oct 20260Derived
dnp3 (Green Energy Corp)C++Apache-2.01.0.0 Git tag108Legacy · quiet

opendnp3, for a decade the default open-source stack, was archived in September 2022 at 3.1.2, and still sits under the Python bindings pydnp3, VOLTTRON’s dnp3-python and the new yadnp3 fork. Step Function I/O’s Rust library, with C, C++, .NET and Java bindings, is actively maintained, but its licence allows non-commercial, non-production use only, with a commercial licence for production: the map files it under its own licence family, source-available. The rest is young: DSC Systems’ go-dnp3 (GPL-3.0) and cB-Sigma’s dnp3 (Apache-2.0) are pure Go stacks from 2026, both with Secure Authentication, and dnp3py brings a pure Python master and outstation with a MESA DER profile. Four of them run in dnp3-interop: Step Function I/O, opendnp3, DSC go-dnp3 and dnp3py. The Triangle MicroWorks adapter is on hold until its licensed source has an agreed way into the builds.

IEEE 2030.5

Young, and shaped by two mandates. IEEE 2030.5 (Smart Energy Profile 2.0) carries export limits, schedules and prices from utilities and aggregators to inverters, batteries and chargers. California’s Rule 21 made it the default for smart inverters through CSIP, and Australian distributors use CSIP-AUS for dynamic operating envelopes, so most of the open field is a research lab’s, a utility programme’s or one developer’s answer to one of those two profiles.

ImplementationLanguageLicenceLatest releaseStarsType
Envoy (ANU)PythonMITv2.5.0 Sept 202627Independent
GridAPPS-D serverGoBattelle BSDv0.18.0 Oct 20260Independent
GridAPPS-D clientGoBattelle BSDv0.1.0 Oct 20260Independent
py20305 (DER Security)PythonApache-2.00.16.0 Oct 20264Independent
sep2_clientRustMIT OR Apache-2.00.1.0 Mar 202423Independent
open-dynamic-exportTypeScriptMITv0.20.0 Jul 202654Independent
VOLTTRON 2030.5 agentPythonApache-2.09.2.0 Oct 2026501Independent
aio2030dot5PythonApache-2.00.4.0 Oct 20260Independent
gridappsd-2030_5PythonApache-2.0untagged2Independent · slowing
go-ieee20305GoMITv0.5.2 Oct 20260Independent
envoy-schemaPythonMIT2.7.0 Sept 202614Derived
CACTUS clientPythonMIT1.3.3 Oct 20263Derived
CACTUS runnerPythonMITv2.10.0 Sept 20267Derived
EPRI IEEE 2030.5 ClientCBSD-3-Clausev0.2.11 Jul 201895Legacy · quiet

The Australian side is the most active: ANU’s Envoy is a complete CSIP-AUS utility server, with its document models and the CACTUS test harnesses built around it, and open-dynamic-export is a CSIP-AUS client that drives home solar and batteries. In the US, PNNL’s GridAPPS-D, whose Python server never got past alpha releases, published a Go server and client in 2026, DER Security’s py20305 is a new client for CSIP and CSIP-AUS, and VOLTTRON has an agent that connects its devices to a server. The EPRI client, written for California’s certified open-source programme, is the oldest open stack and has not changed since 2018. Four of them run in ieee20305-interop: Envoy, GridAPPS-D (server and client), py20305 and the EPRI client. Commercially, embedded clients such as Kitu’s sit next to the test systems that certification runs on, and few vendors publish versions.

The picture across protocols

Protocol Open source Commercial SDKs Primary references
Modbus Very mature Established libmodbus, PyModbus, NModbus, Modbus4J, tokio-modbus
OPC UA Very mature Very established open62541, OPC Foundation .NET, Eclipse Milo, node-opcua, FreeOpcUa
BACnet Mature, fragmented Very established BACnet Stack, BACpypes3, BACnet4J, System.IO.BACnet
IEC 60870-5-104 Specialized Established lib60870, OpenMUC j60870, go-iecp5
IEC 61850 / MMS Specialized Established libiec61850, IEC61850bean
Siemens S7 Mature for classic S7 Established Snap7, S7NetPlus, python-snap7, Apache PLC4X
OpenADR Smaller, evolving Not transparent OpenLEADR (Python and Rust), ElaadNL
OCPP Mature for 1.6J, maturing for 2.x Established The Mobility House ocpp, Java-OCA-OCPP, ocpp-go, EVerest libocpp, CitrineOS, SteVe
DNP3 Mature, few active open stacks Very established opendnp3 (archived), Step Function I/O dnp3 (source-available), DSC go-dnp3, dnp3py
IEEE 2030.5 Young, growing, profile-driven Certification-driven Envoy, GridAPPS-D, py20305, EPRI client (unmaintained)

These are judgements about maturity and visibility, not measured conformance, security or quality. Our interop suites are where we test behaviour; this map is where we record who is out there.

Help us complete it

This is a strong baseline, not an audited directory. We know it misses implementations outside GitHub, commercial SDK details (versions, platforms, evaluation editions) and capability evidence beyond what each README claims.

The whole map is one JSON file, src/data/ecosystem.json, with sources and a verification date on every entry. Open a pull request to add a stack, a commercial SDK, a correction or interop results, and the map updates when it merges. Maintainers are especially welcome to check their own entries.

134 implementations · 10 protocolsOpen the ecosystem mapFilter by language, licence and activity, then jump straight to the source.