Auth模块架构图
classDiagram
class Auth {
+p_main: authImplBase*
+p_reservation: reservationImplBase*
+r_token_provider: vector~auth_token_providerIntf*~
+r_token_validator: vector~auth_token_validatorIntf*~
+r_evse_manager: vector~evse_managerIntf*~
+r_kvs: vector~kvsIntf*~
+auth_handler: AuthHandler*
+init()
+ready()
+set_connection_timeout(int)
+set_master_pass_group_id(string)
}
class AuthHandler {
-selection_algorithm: SelectionAlgorithm
-connection_timeout: int
-master_pass_group_id: optional~string~
-prioritize_authorization_over_stopping_transaction: bool
-ignore_faults: bool
-reservation_handler: ReservationHandler
-evses: map~int, EVSEContext*~
-plug_in_queue: list~int~
-tokens_in_process: set~string~
+on_token(ProvidedIdToken): TokenHandlingResult
+handle_reservation(Reservation): ReservationResult
+handle_cancel_reservation(int): pair~bool, optional~int32_t~~
+handle_session_event(int, SessionEvent)
+handle_permanent_fault_cleared(int, int32_t)
+handle_permanent_fault_raised(int, int32_t)
}
class ReservationHandler {
-evses: map~int, EVSEContext*~
-evse_reservations: map~uint32_t, Reservation~
-global_reservations: vector~Reservation~
-reservation_id_to_reservation_timeout_timer_map: map~int, SteadyTimer*~
+make_reservation(optional~uint32_t~, Reservation): ReservationResult
+cancel_reservation(int, bool, ReservationEndReason): pair~bool, optional~uint32_t~~
+is_evse_reserved(uint32_t): bool
+is_charging_possible(uint32_t): bool
+on_connector_state_changed(ConnectorState, uint32_t, uint32_t)
+matches_reserved_identifier(string, optional~uint32_t~, optional~string~): optional~int32_t~
}
class EVSEContext {
+evse_id: int32_t
+evse_index: int32_t
+transaction_active: bool
+identifier: optional~Identifier~
+connectors: vector~Connector~
+timeout_timer: SteadyTimer
+plugged_in: bool
+plug_in_timeout: bool
+is_available(): bool
+is_unavailable(): bool
}
class Connector {
+id: int
+transaction_active: bool
+state_machine: ConnectorStateMachine
+type: ConnectorTypeEnum
+submit_event(ConnectorEvent)
+is_unavailable(): bool
+get_state(): ConnectorState
}
class ConnectorStateMachine {
-state: ConnectorState
+handle_event(ConnectorEvent): bool
+get_state(): ConnectorState
}
class Identifier {
+id_token: IdToken
+type: AuthorizationType
+authorization_status: optional~AuthorizationStatus~
+expiry_time: optional~string~
+parent_id_token: optional~IdToken~
}
接口
class auth_interface {
<<interface>>
+set_connection_timeout(int)
+set_master_pass_group_id(string)
}
class reservation_interface {
<<interface>>
+handle_reservation(Reservation): ReservationResult
+handle_reservation_exists(string, optional~int~, optional~string~): ReservationCheckStatus
+handle_cancel_reservation(int32_t): pair~bool, optional~int32_t~~
}
class auth_token_provider_interface {
<<interface>>
+provided_token: ProvidedIdToken
}
class auth_token_validator_interface {
<<interface>>
+validate_token(ProvidedIdToken): ValidationResult
}
class evse_manager_interface {
<<interface>>
+get_evse(): Evse
+authorize_response(ProvidedIdToken, ValidationResult)
+withdraw_authorization()
+reserve(int32_t): bool
+cancel_reservation()
+stop_transaction(StopTransactionRequest): bool
+session_event: SessionEvent
}
%% 关系
Auth --> AuthHandler
Auth ..> auth_interface : implements
Auth ..> reservation_interface : implements
Auth ..> auth_token_provider_interface : requires
Auth ..> auth_token_validator_interface : requires
Auth ..> evse_manager_interface : requires
AuthHandler --> ReservationHandler
AuthHandler --> EVSEContext : manages
EVSEContext --> Connector : contains
EVSEContext --> Identifier : optional
Connector --> ConnectorStateMachine
ConnectorStateMachine --> ConnectorState
ConnectorStateMachine --> ConnectorEvent : handles
AuthHandler --> TokenHandlingResult
Auth模块架构分析
Auth模块是Everest Core项目中负责认证处理和预约管理的核心模块。它管理电动汽车充电过程中的认证、授权和预约功能。
核心组件结构
Auth类
- 作为模块入口点,实现了authImplBase和reservationImplBase接口
- 包含AuthHandler实例,负责处理具体的认证逻辑
- 在初始化时建立与其他模块的连接(token_provider、token_validator、evse_manager)
AuthHandler类
- 负责处理认证、授权和处理会话事件
- 管理EVSEContext对象集合,表示充电桩的状态
- 包含ReservationHandler处理预约相关功能
Connector和ConnectorStateMachine
- Connector: 表示物理连接器,包含状态机
- ConnectorStateMachine: 实现连接器的状态转换逻辑
ReservationHandler
- 处理预约的创建、取消和状态管理
- 支持特定EVSE的预约和全局预约
主要对象和状态
EVSE与Connector状态
- EVSE(充电桩)包含多个Connector(连接器)
- ConnectorState表示连接器的状态:
- AVAILABLE: 可用
- UNAVAILABLE: 不可用
- FAULTED: 故障
- OCCUPIED: 被占用
- UNAVAILABLE_FAULTED: 不可用且故障
- FAULTED_OCCUPIED: 故障且被占用
认证对象
- ProvidedIdToken: 由auth_token_provider提供的标识令牌
- ValidationResult: 验证结果
- Identifier: 验证后的标识信息
预约对象
- Reservation: 表示一个预约请求
- ReservationResult: 预约请求结果
工作流程
认证流程
sequenceDiagram
participant TP as TokenProvider
participant Auth
participant AH as AuthHandler
participant TV as TokenValidator
participant EM as EvseManager
TP->>Auth: provided_token
Auth->>AH: on_token(provided_token)
AH->>TV: validate_token(provided_token)
TV-->>AH: ValidationResult
alt token valid
AH->>EM: authorize_response(provided_token, validation_result)
EM-->>Auth: session_event(Authorized)
else token invalid
AH->>Auth: publish_token_validation_status(Rejected)
end
预约处理流程
sequenceDiagram
participant Client
participant Auth
participant RH as ReservationHandler
participant EM as EvseManager
Client->>Auth: handle_reservation(reservation)
Auth->>RH: make_reservation(evse_id, reservation)
alt reservation possible
RH->>EM: call_reserved(reservation_id, evse_id)
RH-->>Auth: ReservationResult(Accepted)
else reservation not possible
RH-->>Auth: ReservationResult(Rejected)
end
状态管理
stateDiagram-v2
[*] --> AVAILABLE
AVAILABLE --> UNAVAILABLE: DISABLE
AVAILABLE --> FAULTED: FAULTED
AVAILABLE --> OCCUPIED: TRANSACTION_STARTED
UNAVAILABLE --> AVAILABLE: ENABLE
UNAVAILABLE --> UNAVAILABLE_FAULTED: FAULTED
FAULTED --> AVAILABLE: ERROR_CLEARED
FAULTED --> FAULTED_OCCUPIED: TRANSACTION_STARTED
OCCUPIED --> AVAILABLE: SESSION_FINISHED
UNAVAILABLE_FAULTED --> UNAVAILABLE: ERROR_CLEARED
UNAVAILABLE_FAULTED --> FAULTED: ENABLE
FAULTED_OCCUPIED --> FAULTED: SESSION_FINISHED
FAULTED_OCCUPIED --> OCCUPIED: ERROR_CLEARED
关键代码分析
令牌处理
TokenHandlingResult AuthHandler::on_token(const ProvidedIdToken& provided_token) {
// 加锁以确保线程安全
std::unique_lock<std::mutex> lk(this->event_mutex);
// 处理令牌
return this->handle_token(provided_token, lk);
}会话事件处理
void AuthHandler::handle_session_event(const int evse_id, const SessionEvent& session_event) {
// 处理充电过程中的会话事件
// 如SessionStarted, TransactionStarted, ChargingStarted等
}状态转换
bool ConnectorStateMachine::handle_event(ConnectorEvent event) {
// 根据事件和当前状态转换到新状态
// 例如: AVAILABLE → OCCUPIED (当TRANSACTION_STARTED事件发生)
}配置选项
Auth模块支持多种配置选项:
-
selection_algorithm: 选择算法,决定如何为令牌选择连接器
- FindFirst: 选择第一个可用连接器
- PlugEvents: 基于插入事件选择连接器
-
connection_timeout: 连接超时(秒)
-
master_pass_group_id: 主通行证组ID,拥有这个ID的令牌可以停止任何交易
-
prioritize_authorization_over_stopping_transaction: 授权优先级配置
-
ignore_connector_faults: 是否忽略连接器故障
总结
Auth模块是Everest Core项目中负责认证、授权和预约的关键模块,实现了充电站身份验证和预约系统的核心功能。它使用状态机管理连接器状态,通过回调机制与其他模块交互,并支持多种认证和预约策略。
该模块的设计体现了面向对象和事件驱动的编程范式,通过清晰的接口定义、状态管理和回调机制,实现了充电认证系统的复杂需求。