Skip to content

Changes to 3.x release

Easier to build

OpenDNP3 was refactored to create a single library that is easy to build and to use. Simply link with opendnp3 and you are good to go.

The CMake was completely refactored to modern practices and no longer affects global flags. Therefore, it is possible to include OpenDNP3 as a submodule in your CMake project and simply add_subdirectory to include it to your compilation process.

Private dependencies needed to build the library are now automatically fetched by CMake. No more submodule to sync or dependencies out of sync. The only dependency that still needs to be installed on the build system is OpenSSL if TLS support is required.

Intuitive API

The outstation database was refactored to simplify its usage. The points are now described using a map instead of an array of indices. It is no longer required to have them in a particular order since the map will automatically order them. It is also no longer required to specify if points are in order or not.

To ease the common usage of updating points when receiving a command, an IUpdateBuilder is now provided in every callback of ICommandHandler. Also, begin and end callbacks were added to help determine which commands are grouped together in a single APDU.

On the master side, the ISOEHandler was updated to include begin_fragment and end_fragment callbacks. Each of these callbacks receive a ResponseInfo to help determine if it's a multi-fragment response or an unsolicited response. To help distinguish which request generated which response, it is now possible to provide a distinct SOEHandler on each request.

To help users reading configuration parameters from files, all the public enumerations used by the library exposes a to_string and a from_string method. It also exposes a to_type and from_type to convert to the underlying integer value.

Control Relay Output Block was refactored to expose every field individually instead of providing a gigantic enum with all the possible (and sometimes impossible) values.

Full conformance

OpenDNP3 is now fully compliant with DNP3 Subset Level 2. It includes the following features that were previously missing:

  • Immediate Freeze (0x07), Immediate Freeze No Ack (0x08), Freeze-and-Clear (0x09) and Freeze-and-Clear No Ack (0x10) support
  • Broadcast support
  • UDP support
  • Unsolicited retry count
  • Timestamp quality (for proper CTO variation)

Conformance testing is automatically performed on every commit and detailed reports are publicly available.

Better testing

An extensive continuous integration setup was setup to make sure that the library is always in great shape and that no regression are introduced. You can see the integration pipeline being executed here. Also, each commit will have a ✔ that you can click to see the results.

The CI pipeline also produces ready-to-use packages for each platform. It also produces NuGet packages of the C# bindings and Maven packages of the Java bindings that can be used as is. Finally, conformance results including packet captures are also made available.

More extensive integration testing were written for the 3.0 release to ensure the library always behave as expected. Some of these integration tests were written using the Java bindings and are also executed by the CI pipeline.

Full conformance testing using the latest test procedure developed by the DNP Users Group are executed on every commit. For information about the product used for automatic conformance testing and you can use it to assess the conformity of your devices, contact Automatak.

Other changes

Sending confirmed data-link frames is not supported anymore. This feature has caused many issues and is not well specified in the standard itself. It is not required for conformance and should never be used in the real world. Please note that the library still supports receiving confirmed data-link frames and will confirm them, maintaining full interoperability with all conforming equipment.

The ASIO dependency was updated to v1.16.