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.