Changelog

1.8.0 (17-Jul-2026)

Added

  • Added a new logging subsystem
    • no external dependencies, using a plain console logger
    • pluggable via LoggerFactory.setProvider()
    • supports the log levels RAW, TRACE, DEBUG, INFO, WARN, and ERROR
    • configurable via -Dorg.openmuc.j60870.log.level=
  • Added ASdu.buildCotResponse() to simplify creation of response ASDUs
  • Added ASduType.isCommandType() to enforce a single sequence element for command-type ASDUs
  • Added hostname support for checkAllowedIPs

Changed

  • Raised the minimum required Java version to 11
  • Refactored ASdu.java

Fixed

  • Fixed aSduListener being null after sending STOPDT act
  • Fixed byte order in IeFixedTestBitPattern from 0x55/0xAA to 0xAA/0x55
  • Fixed an array out-of-bounds condition when decoding undersized unknown APDUs
  • Hardened ASDU decoding by requiring at least one information object and one sequence element

Build and test

  • Updated Gradle to 8.14.5
  • Migrated tests to JUnit 5 and removed JUnit 4, PowerMock, and JUnitParams
  • Updated test dependencies to Mockito 5.23, Awaitility 4.3, and JaCoCo 0.8.16

Documentation

  • Migrated the documentation from AsciiDoc to Markdown

1.7.2 (02-May-2024)

Fixed

  • Fixed sending an incorrect STOPDT con after reconnection when a new S-frame is received

1.7.1 (23-Apr-2024)

Fixed

  • Fixed sending STOPDT con when an S-frame is received after STOPDT act

1.7.0 (09-Apr-2024)

Added

  • Added ASDU type filtering via Server.builder().setAllowedASduTypes()
  • Automatic respons to unsupported incoming ASDU types when filtering is configured
  • Added support for returning a ConnectionEventListener from ServerEventListener.connectionIndication(Connection)

Changed

  • Moved client connection listener configuration from Connection.setConnectionListener() to ClientConnectionBuilder.setConnectionEventListener()

Removed

  • Removed setConnectionEventListenerBeforeStart()
  • Removed connection.setConnectionListener()

1.6.4 (17-Jan-2024)

Added

  • Added an internal pending state to improve connection state handling
  • Added ReservedASduTypeDecoder to support future definitions in the reserved range <= 127

1.6.3 (15-Nov-2023)

Added

  • Added the Connection object to ConnectionEventListener methods

Changed

  • Sending an ASdu while in the stopped state now throws IllegalArgumentException

1.6.2 (24-Oct-2023)

Added

  • Added setConnectionEventListenerBeforeStart() to ServerEventListener to ensure a listener is set before connection establishment

Fixed

  • Fixed dataTransferStateChanged not being triggered when data transfer enters the stopped state
  • Fixed newAsdu being triggered on the first connection even when isStopped=true

1.6.1 (20-Jul-2023)

Fixed

  • Fixed missing wait for an outstanding S-frame from the master before sending STOPDT con
  • Fixed missing TESTFR after the initial connection
  • Fixed the connection being closed when receiving a reserved ASDU
  • Fixed sending S-format frames for messages that had already been acknowledged

1.6.0 (23-Jun-2023)

Removed

  • Removed deprecated org.openmuc.j60870.Connection#waitForStartDT
  • Removed deprecated org.openmuc.j60870.Connection#startDataTransfer(ConnectionEventListener listener, int timeout)
  • Use org.openmuc.j60870.Connection#startDataTransfer(ConnectionEventListener listener) instead

Added

  • Added validation to ensure t2 < t1 and t3 > t1

Fixed

  • Fixed missing S-frame confirmation during STOPDT
  • Fixed missing connectionClosed(Connection, IOException) events while in STOPDT

Build and test

  • Updated JUnit to 4.13.2 to address CVE-2020-15250

CLI app

  • Fixed Windows start scripts
  • Fixed COUNTER_INTERROGATION_ACTION_KEY exception

1.5.0 (02-Aug-2022)

Added

  • Added ConnectionEventListener#dataTransferStateChanged(Connection, boolean) to signal handling of STARTDT act and STOPDT act
  • Added sendConfirmation with an explicit cause-of-transmission parameter
  • Added a server-side IP whitelist
  • Added getters for local and remote addresses
  • Added sendActivationTermination to simplify interrogation sequences

Changed

  • Raised the minimum required Java version to 8

Removed

  • Removed the javax dependency

Fixed

  • Fixed a bug where connections were not closed after the maximum number of connections had been reached
    thanks to Konstantinos Ntermitzoglou from inaccess

CLI app

  • Added Counter Interrogation Command to the console client
  • Added timestamps to log messages
  • Replaced deprecated methods

1.4.0 (19-Jun-2020)

Added

  • Added STOPDT
    • added STOPDT state
    • added sendStopDataTransfer()
  • Added parameter k to configure the maximum number of outstanding I PDUs
  • Added setConnectionTimeout for t0
  • Added Connection#sendResponse with a station address parameter

Deprecated

  • Deprecated Connection#waitForStartDT
  • Deprecated Connection#startDataTransfer(ConnectionEventListener listener, int timeout) in favor of Connection#startDataTransfer(ConnectionEventListener listener)

Fixed

  • Fixed TimeoutTask not working after startup
  • Fixed continued sending while waiting for acknowledgment

CLI app

  • Added STARTDT and STOPDT
  • Added support for configuring t0

1.3.1 (11-Jun-2019)

Fixed

  • Fixed a sequence number overflow bug
    thanks to Sven Liebehentze from Fraunhofer IEE

1.3.0 (29-Mar-2019)

Changed

  • Moved IE classes to org.openmuc.j60870.ie
  • Renamed TypeId to ApduType
  • Changed the builder API to use build() instead of connect()
  • Reduced the number of active threads per connection

Added

  • Added socket timeout configuration

Fixed

  • Fixed APCI parsing
  • Fixed issues in IeBinaryCounterReading
  • Fixed a DST issue in IeTime56.getTimestamp()
  • Fixed duplicated timeout tasks in the queue
  • Fixed maxTimeNoAckSentTimer

CLI app

  • Moved the CLI app into a separate project
  • Added single commands
  • Added support for configuring the SO timeout
  • Added connection retry support

1.2.1 (11-Oct-2017)

Fixed

  • Fixed a bug in C_RC_TA_1

1.2.0 (04-Jan-2017)

Added

  • Added support for explicitly setting the CauseOfTransmission field when sending SingleCommand
    thanks to Dean Ouelette from RTDS

1.1.1 (04-Oct-2016)

Changed

  • Replaced the fixed thread pool with a cached thread pool so unused threads can be cleaned up automatically
  • Improved normalized value and binary state information element classes without changing API behavior

Fixed

  • Fixed ASDU notification cleanup when a connection is closed
    thanks to Mr. Tellenbach
  • The client no longer closes the connection if data is received before STARTDT con; the data is discarded instead

1.1.0 (06-Jun-2016)

Changed

  • Renamed ClientSap to ClientConnectionBuilder
  • Renamed ServerSap to Server.Builder
  • Refactored the console client

Added

  • Added stopListening() to ServerSap for clean shutdown

Fixed

  • Fixed millisecond conversion in IeTime24
    thanks to Juergen Wieferink from BTC AG

1.0.0 (24-Feb-2016)

Fixed

  • Fixed a bug when creating multiple parallel connections using the same ClientSap
  • Fixed a synchronization issue in the server implementation
  • Fixed IeTime56.toString()
    thanks to Jan Gall from Bosch

0.9 (19-Nov-2014)

Added

  • Added full support for timers t1, t2, and t3

Fixed

  • Fixed a bug in IeTime56

Documentation

  • Improved the documentation

0.8 (07-Aug-2014)

Changed

  • Merged ClientConnection and ServerConnection into a single Connection class to support reverse communication on the server side
  • Made Connection methods thread-safe

Removed

  • Removed the slf4j dependency

0.6 (24-Apr-2014)

Added

  • Added automatic client-side sending of S-format APDUs to acknowledge incoming I-format APDUs
  • Added automatic client-side sending of TESTFR con in response to TESTFR act

0.5 (10-Apr-2014)

Added

  • Added support for common addresses greater than 255
  • Added utility methods to calculate common addresses and information object addresses from individual bytes
  • Added support for private-range Type IDs

0.4 (21-Mar-2014)

Added

  • Added SampleServer
  • Added sendConfirmation(ASdu aSdu) to ServerConnection to simplify sending confirmation messages that mirror incoming requests except for the causeOfTransmission field

Changed

  • Renamed the ioException callback method of ASduListener

Build and test

  • Updated build.gradle to work with Gradle 1.11

0.3 (14-Mar-2014)

Added

  • Added support for all possible type identifications
  • Added toString() methods for all information elements
  • Added run scripts for ClientApp

Documentation

  • Improved Javadoc
  • Added a user guide

0.2 (28-Feb-2014)

Added

  • Initial release