Crate lib60870

Crate lib60870 

Source
Expand description

Safe Rust bindings for IEC 60870-5-101/104 protocols.

This crate provides safe wrappers around the lib60870-C library for implementing IEC 60870-5-104 (TCP/IP) communication.

§Features

  • Client (Master): Connect to IEC 104 servers and send commands
  • Server (Slave): Accept connections and send spontaneous data
  • Safe API: Automatic memory management, Rust callbacks
  • Common types: Quality descriptors, cause of transmission, timestamps

§Quick Start - Client

use lib60870::client::{Connection, ConnectionBuilder};
use lib60870::types::{CauseOfTransmission, QOI_STATION};

let mut conn = ConnectionBuilder::new("127.0.0.1", 2404)
    .originator_address(3)
    .build()
    .expect("Failed to create connection");

conn.set_handlers(
    |event| println!("Event: {:?}", event),
    |asdu| {
        println!("Received: {:?}", asdu);
        for obj in asdu.parse_objects() {
            println!("  {:?}", obj);
        }
        true
    },
);

if conn.connect() {
    conn.send_start_dt();
    conn.send_interrogation(CauseOfTransmission::Activation, 1, QOI_STATION);
    std::thread::sleep(std::time::Duration::from_secs(5));
}

§Quick Start - Server

use lib60870::server::{Server, ServerBuilder};
use lib60870::types::{CauseOfTransmission, Quality};

let mut server = ServerBuilder::new()
    .local_port(2404)
    .build()
    .expect("Failed to create server");

server.set_connection_event_handler(|event| {
    println!("Connection event: {:?}", event);
});

server.set_interrogation_handler(|conn, asdu, qoi| {
    println!("Interrogation for group {}", qoi);
    conn.send_act_con(&asdu, false);
    // Send data...
    conn.send_act_term(&asdu);
    true
});

server.start();

// Send spontaneous data
loop {
    server.send_measured_scaled(
        CauseOfTransmission::Spontaneous,
        1,    // Common address
        100,  // IOA
        42,   // Value
        Quality::GOOD,
    );
    std::thread::sleep(std::time::Duration::from_secs(1));
}

§Crate Features

  • tls - Enable TLS support (downloads and links mbedtls 2.28)
  • debug - Enable printf debug output in lib60870
  • no-threads - Disable threading support (for embedded systems)
  • tcp-keepalive - Enable TCP keep-alive

§License

lib60870 is dual-licensed under GPLv3 and a commercial license. See https://github.com/mz-automation/lib60870 for details.

Re-exports§

pub use asdu::Asdu;
pub use client::Connection;
pub use client::ConnectionBuilder;
pub use info::DoublePoint;
pub use info::DoublePointValue;
pub use info::InfoObject;
pub use info::Ioa;
pub use info::MeasuredFloat;
pub use info::MeasuredNormalized;
pub use info::MeasuredScaled;
pub use info::SingleCommand;
pub use info::SinglePoint;
pub use server::MasterConnection;
pub use server::Server;
pub use server::ServerBuilder;
pub use time::Timestamp;
pub use types::CauseOfTransmission;
pub use types::ConnectionEvent;
pub use types::PeerConnectionEvent;
pub use types::Quality;
pub use types::ServerMode;
pub use types::TypeId;
pub use types::DEFAULT_PORT;
pub use types::DEFAULT_TLS_PORT;
pub use types::QOI_STATION;

Modules§

asdu
Application Service Data Unit (ASDU) for IEC 60870-5.
client
IEC 60870-5-104 client (master) implementation.
info
Information object types for IEC 60870-5.
server
IEC 60870-5-104 server (slave) implementation.
sys
Raw FFI bindings - use only if you need low-level access. Raw FFI bindings to lib60870-C.
time
Time types for IEC 60870-5-101/104.
types
Common types and enums for IEC 60870-5-101/104.

Functions§

library_version
Get the lib60870 library version.
set_debug_output
Enable or disable debug output.