| Crates.io | ocpp_rs |
| lib.rs | ocpp_rs |
| version | 0.2.5 |
| created_at | 2024-07-04 22:46:43.2519+00 |
| updated_at | 2025-06-03 14:08:31.876423+00 |
| description | Protocol implementation for Open Charge Point Protocol (OCPP) in Rust. |
| homepage | https://github.com/angelorodem/ocpp-rs |
| repository | https://github.com/angelorodem/ocpp-rs |
| max_upload_size | |
| id | 1292157 |
| size | 292,892 |
OCPP-RS is a Rust library for implementing the Open Charge Point Protocol (OCPP) in Rust.
it currently supports OCPP 1.6.
Full implementation of OCPP 1.6 Protocol
Currently most feature complete implementation of OCPP 1.6 in rust
Batteries included, serialization and deserialization is provided here
No_std, should work fine on embedded devices that allow heap allocation with a global allocator
Inspired by a python ocpp library
In Cargo.toml, add the following dependency:
[dependencies]
ocpp-rs = "^0.2"
Since the original OCPP 1.6 protocol does not contain a type field for CallResult, when parsing CallResultlt, you need to handle
Special cases where JSON payloads are ambiguous, like empty objects like: {}, these might get serialized as a EmptyResponse instead of the variant
you are waiting for like GetConfiguration.
Look at this file to see how to properly handle CallResults: example
Receiving a payload from a client:
use ocpp_rs::v16::parse::{self, Message};
use ocpp_rs::v16::call::{Action, Call};
// Example incoming message
let incoming_text = "[2, \"19223201\", \"BootNotification\", { \"chargePointVendor\": \"VendorX\", \"chargePointModel\": \"SingleSocketCharger\" }]";
let incoming_message = parse::deserialize_to_message(incoming_text);
if let Ok(Message::Call(call)) = incoming_message {
match call.payload {
Action::BootNotification(_boot_notification) => {
// Do something with boot_notification
}
_ => {
// Handle other actions
}
}
}
Sending a payload to a client:
let response = Message::CallResult(CallResult::new(
"1234".to_string(),
ResultPayload::StartTransaction(call_result::StartTransaction {
transaction_id: 0,
id_tag_info: IdTagInfo {
status: ocpp_rs::v16::enums::ParsedGenericStatus::Accepted,
expiry_date: None,
parent_id_tag: None,
},
}),
));
let json = parse::serialize_message(&response)?;
println!("Sending to client: {}", json);
Contributions are welcome! Common steps to contribute:
Help is wanted to add more tests and fuzzing tests (e.g., using OSS-Fuzz), so feel free to jump in!