Skip to content

Releases: MatrixEditor/icspacket

v0.2.4: IED control and MMS file transfer

28 Sep 07:53

Choose a tag to compare

This release adds support for transferring files to a remote MMS server and implements the control object model of IEC61850.

  • A new example has been added: iedctrl.py can be used to operate on IEDs
  • The put command can be used within the mmsclient.py to upload files to a MMS server

Full Changelog: v0.2.3...v0.2.4

v0.2.3: GOOSE and SampledValues for IEC61850

05 Sep 16:06

Choose a tag to compare

This release adds explicit support for GOOSE and SampledValues using a GOOSE_Client and SV_Client. Both require higher privileges when used unless they are reading a PCAP file.

  • A new example has been added: gooseobserv.py can be used to print out all published GOOSE messages
  • Added Timestamp to convert MMS UtcTime values to datetime objects

v0.2.2: IEC 61850 Support

31 Aug 19:41

Choose a tag to compare

This release includes additional fixed for communication establishment using ACSE, COTP and ISO Presentation as well as a partial mapping of IEC61850 for MMS over TCP.

New Tools

  • iedmap.py: enumerate IEDs using MMS and display all available logical nodes
  • dnp3linkaddr.py: dynamic resolution of the DNP3 link address of an outstation.

Full Changelog: v0.2.1...v0.2.2

0.2.1: DNP3 Utility: Reading Data Objects

30 Aug 07:28

Choose a tag to compare

This release adds a new utility that is able to read data objects from an outstation using the DNP3 protocol:

$ dnp3read.py -t [email protected] -class1
[I] Connecting to outstation (1024) at 127.0.0.1:20000...                                                          
Data Objects:
├── Object(s): Analog output event (Obj: 42, Var: 1) [Count: 1]
│   └── 32-bit without time [0]: (prefix: 7) 
│       ├── comm_lost: False
│       ├── local_forced: False
│       ├── online: True
│       ├── over_range: False
│       ├── reference_err: False
│       ├── remote_forced: False
│       ├── reserved0: False
│       ├── restart: False
│       └── value: 1
└── Object(s): Octet string event (Obj: 111, Var: 5) [Count: 1]
    └── Octet string event [0]: (prefix: 7) 
        00000000:   48 65 6c 6c 6f                                    Hello


Full Changelog: v0.2.0...v0.2.1

v0.2.0: DNP3 Implementation

29 Aug 21:48

Choose a tag to compare

This release includes an almost complete implementation of the DNP3.0 object standard library and a sample implementation of a Master realized more or less as a client. Its interface is designed to be simple, yet effective:

from icspacket.proto.dnp3.master import DNP3_Master
from icspacket.proto.dnp3.const import FunctionCode
from icspacket.proto.dnp3.objects.util import new_class_data_request
from icspacket.proto.dnp3.objects.coding import unpack_objects

# 1. Create a new master (client) - must include the local link address
master = DNP3_Master(link_addr=0x0001)

# 2. Associate (connect) with the remote peer - must provide the remote link address
remote_link_addr = 1024
master.associate((remote_link_addr, "127.0.0.1", 20000))

# 3. Create a READ request and block until a response is received
objects = new_class_data_request(1, 2, 3)
apdu = master.request(FunctionCode.READ, objects)

# 4. decode objects using standard library - the result will be a mapping
#    of DNP3Objects[group][variation] -> DNP3ObjectVariations
objects = unpack_objects(apdu.objects)

This release also includes a new script dnp3dump.py that can display object data within DNP3 packets:

$ dnp3dump.py -apdu "c68100001e01000000010000000028030000000100000000"
 [I] Parsed RESPONSE (129) APDU (FIR, FIN), SEQ: 6
 [I] No Internal Indications (IIN)
 Data Objects:
 ├── Object(s): Analog input (Obj: 30, Var: 1) [Range: 0-1]
 │   └── 32-bit with flag [0]:
 │       ├── comm_lost: False
 │       ├── local_forced: False
 │       ├── online: True
 │       ├── over_range: False
 │       ├── reference_err: False
 │       ├── remote_forced: False
 │       ├── reserved0: False
 │       ├── restart: False
 │       └── value: 0
 └── Object(s): Analog output status (Obj: 40, Var: 3) [Range: 0-1]
     └── single-precision, floating-point with flag [0]:
         ├── comm_lost: False
         ├── local_forced: False
         ├── online: True
         ├── over_range: False
         ├── reference_err: False
         ├── remote_forced: False
         ├── reserved0: False
         ├── restart: False
         └── value: 0.0

Some Fixes

  • hexdump() now respects the width for all parts
  • Add IEC61850 ASN.1 sources to package and enable compilation

Full Changelog: v0.1.0...v0.2.0

v0.1.0: Initial Release - MMS, ISO Stack and DNP3 (partial)

26 Aug 16:16

Choose a tag to compare

Implementation for the following protocols:

  • TPKT (RFC1006)
  • X.224 (COTP)
  • X.225 / ISO 3237-1 (COSP)
  • X.226 / ISO 8823 (COPP)
  • X.227 ACSE
  • MMS / ISO 9506-1,2
  • DNP3 (partial)
  • IEC61850 (only ASN.1 definitions)

Two tools were added:

  • mmsclient.py: handly CLI to use the file management service of the MMS protocol (ls, read, delete)
  • mms_utility.py: implements variable operations (read, write, query) using the MMS protocol