# SEP2 Client Library
`sep2_client` is a (WIP) Rust library for developing IEEE 2030.5 compliant clients on Linux[^1] based operating systems.
It relies on, and should be used alongside, the [`sep2_common`](https://github.com/ethanndickson/sep2_common) crate, and it's implementation of the IEEE 2030.5 XSD.
This crate uses async rust, and currently only supports the [`tokio`](https://github.com/tokio-rs/tokio) runtime.
[Documentation](https://ethanndickson.github.io/sep2_client_docs/sep2_client/)
# Contents
[`sep2_client`](sep2_client) - Implementation of an IEEE 2030.5 Client Library, including documentation & examples
[`sep2_test_server`](sep2_test_server) - Dumb IEEE 2030.5 Server for testing
[`docs`](docs) - Thesis Project Reports & Seminars
# Progress
### Core Features
- [x] Application Support Function Set (TCP, HTTP)
- [x] Security Function Set (TLS + Certificate Verification, HTTPS)
- [x] IEEE 2030.5 Base Client Capabilities (GET, POST, PUT, DELETE)
- [x] Asynchronous Resource Polling
- [x] Notification / Subscription Client Server Mechanism
- [x] Global Time Offset (Server Time Sync)
- [x] Event Scheduler
- [x] DER
- [x] DRLC
- [x] Messaging
- [x] Pricing
- [x] Per-Schedule Time Offset
- [x] Tests / Documentation
- [x] IEEE 2030.5 Examples as System Tests
- [x] Event Scheduler Tests
- [x] Subscription/Notification Tests
- [x] DER Non-Aggregate Client Sample Impl.
- [x] Australian CSIP Extensions
### Future
- [ ] DNS-SD
- [ ] [rustls ECDHE-ECDSA-AES128-CCM8 Support](https://github.com/rustls/rustls/issues/1034)
# Examples
A client that synchronises it's time with the server:
```rust
use sep2_client::{client::Client, time::update_time_offset};
use sep2_common::packages::{dcap::DeviceCapability, time::Time};
#[tokio::main]
async fn main() {
// Create a HTTPS client for a specific server
let client = Client::new_https(
"https://127.0.0.1:1337",
"client_cert.pem",
"client_private_key.pem",
"serca.pem",
// No KeepAlive
None,
// Default Poll Tick Rate (10 minutes)
None,
)
.expect("Couldn't create client");
let dcap = client
.get::<DeviceCapability>("/dcap")
.await
.expect("Couldn't retrieve dcap");
let time_link = &dcap.time_link.unwrap();
let time = client.get::<Time>(&time_link.href).await.unwrap();
// Sync client time
update_time_offset(time);
}
```
More comprehensive examples can be found in the [`sep2_client/examples`](sep2_client/examples) directory.
# Cargo Features
Features can be enabled or disabled through your crate's Cargo.toml
```toml
[dependencies.sep2_client]
features = ["der","pubsub"]
```
### Full list of features
- `default`: All mandatory IEEE 2030.5 Client function sets. Application Support, Security & Time.
- `event`: A Generic Event Schedule interface
- `der`: A Scheduler for DER Function Set Events
- `pricing`: A Scheduler for Pricing Function Set Events
- `messaging`: A Scheduler for Messaging Function Set Events
- `drlc`: A Scheduler for DRLC Function Set Events
- `pubsub`: A lightweight server for the Subscription / Notification function set.
- `csip_aus`: CSIP-AUS Extensions
- `all`: All of the above
# Dependencies
Due to the security requirements of IEEE 2030.5, this library only supports TLS using OpenSSL.
To use this library you will require a local installation of OpenSSL with support for `ECDHE-ECDSA-AES128-CCM8`.
## License
Licensed under either of
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
### Contribution
Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, as defined in the Apache-2.0
license, shall be dual licensed as above, without any additional terms
or conditions.