以 libocpp 库为例
依赖定义和链接
- 在
module-dependencies.cmake文件中,通过ev_define_dependency函数定义了 OCPP 和 OCPP201 模块依赖于 libocpp
ev_define_dependency(
DEPENDENCY_NAME libocpp
DEPENDENT_MODULES_LIST OCPP OCPP201)- 在 OCPP 和 OCPP201 模块的 CMakeLists.txt 中,使用
target_link_libraries命令链接了 libocpp 相关库:
target_link_libraries(${MODULE_NAME}
PRIVATE
OpenSSL::SSL
OpenSSL::Crypto
everest::ocpp
everest::ocpp_evse_security
everest::ocpp_conversions
everest::external_energy_limits
)头文件引用
- OCPP 模块引入了 libocpp 的 v16 版本的头文件:
#include <ocpp/common/types.hpp>
#include <ocpp/v16/charge_point.hpp>
#include <ocpp/v16/types.hpp>
#include <ocpp/v2/ocpp_types.hpp>- OCPP201 模块引入了 libocpp 的 v2 版本的头文件:
#include <ocpp/v2/charge_point.hpp>实例化和使用
- 每个模块创建了一个 ChargePoint 类的实例:
- OCPP 模块:
std::unique_ptr<ocpp::v16::ChargePoint> charge_point; - OCPP201 模块:
std::unique_ptr<ocpp::v2::ChargePoint> charge_point;
- OCPP 模块:
- 在初始化代码中,注册了回调函数,将 libocpp 的事件和命令与 everest 内部的函数连接起来:
this->charge_point->register_pause_charging_callback([this](int32_t connector) {
// 代码实现
});
this->charge_point->register_resume_charging_callback([this](int32_t connector) {
// 代码实现
});
// 更多回调注册...事件处理
- OCPP 模块监听来自 everest 其他模块的事件,并转发给 libocpp:
evse->subscribe_session_event([this, evse_id](types::evse_manager::SessionEvent session_event) {
// 处理会话事件并调用 ChargePoint 的方法
this->charge_point->on_transaction_started(...)
// 更多处理...
});类型转换
- 使用 conversion 工具函数在 everest 内部类型和 OCPP 类型之间转换:
conversions::to_ocpp_log_status_enum(status.log_status)
conversions::to_everest_upload_logs_request(request)状态通知
- 将 OCPP 状态通知转发到系统的其他部分:
this->r_system->subscribe_log_status([this](types::system::LogStatus log_status) {
this->charge_point->on_log_status_notification(...)
});总结
总之,everest-core 通过以下方式调用和集成 libocpp:
- 在构建系统中将 libocpp 定义为依赖并链接
- 创建 libocpp ChargePoint 类的实例
- 注册回调函数以处理 OCPP 命令
- 捕获系统事件并通过调用 ChargePoint 实例的方法通知 libocpp
- 使用转换函数在 everest 内部数据类型和 OCPP 数据类型之间转换
这种架构实现了清晰的职责分离:
- libocpp 负责 OCPP 协议实现
- everest-core 集成 libocpp 并将其连接到充电站的各个组件和模块