## OCPP 1.6 授權與交易流程詳解 ### 一、核心概念定義 **引用章節**: Section 2.2 Definitions (Page 5-6), Section 3.6 (Page 15-16) | 術語 | 定義 | |------|------| | **Charging Session** | 用戶或 EV 首次互動開始(刷卡、遠端啟動、插線、佔位偵測等) | | **Transaction** | 所有充電前提條件滿足時開始(EV 連接且用戶已授權),直到條件不可逆地變為 false | | **Energy Offer Period** | EVSE 準備好並願意供電的時段 | | **Energy Transfer Period** | 實際能量傳輸的時段(一個 Transaction 可有多個) | --- ### 二、授權機制 (Authorization) **引用章節**: Section 3.5 Local Authorization & Offline Behavior (Page 12-15), Section 4.1 Authorize (Page 32) #### 2.1 授權方式優先順序 ``` 1. Local Authorization List (本地授權清單) - 最高優先 2. Authorization Cache (授權快取) 3. Central System Authorization (遠端授權) ``` #### 2.2 Authorize.req/conf 訊息 **Authorize.req** (`Section 6.1, Page 60`) ```json { "idTag": "string[20]" // 必要,用戶識別碼 } ``` **Authorize.conf** (`Section 6.2, Page 60`) ```json { "idTagInfo": { "status": "Accepted|Blocked|Expired|Invalid|ConcurrentTx", // 必要 "expiryDate": "datetime", // 選填 "parentIdTag": "string[20]" // 選填 } } ``` #### 2.3 AuthorizationStatus 狀態說明 | Status | 說明 | |--------|------| | `Accepted` | 識別碼已接受,允許充電 | | `Blocked` | 識別碼被封鎖 | | `Expired` | 識別碼已過期 | | `Invalid` | 識別碼無效/不明 | | `ConcurrentTx` | 識別碼已有進行中的交易 | #### 2.4 本地授權清單 (Local Authorization List) **引用章節**: Section 3.5.2 (Page 13) - 由 Central System 同步管理 - 使用 `SendLocalList.req` 進行完整或差異更新 - 支援 `Full` 或 `Differential` 更新模式 - 相關組態鍵: `LocalAuthListEnabled`, `LocalAuthListMaxLength` #### 2.5 授權快取 (Authorization Cache) **引用章節**: Section 3.5.1 (Page 13) - 自動維護先前成功授權的識別碼記錄 - 從 `Authorize.conf`, `StartTransaction.conf`, `StopTransaction.conf` 更新 - 相關組態鍵: `AuthorizationCacheEnabled` --- ### 三、交易流程 (Transaction Flow) #### 3.1 標準交易流程 **引用章節**: Section 3.4 (Page 10-11), Figure 1 ``` ┌─────────────┐ ┌─────────────────┐ │ Charge Point│ │ Central System │ └──────┬──────┘ └────────┬────────┘ │ │ │ [1] Authorize.req(idTag) │ │────────────────────────────────────>│ │ │ │ [2] Authorize.conf(idTagInfo) │ │<────────────────────────────────────│ │ │ │ *** 開始充電 *** │ │ │ │ [3] StartTransaction.req │ │ (connectorId, idTag, │ │ meterStart, timestamp, │ │ [reservationId]) │ │────────────────────────────────────>│ │ │ │ [4] StartTransaction.conf │ │ (idTagInfo, transactionId) │ │<────────────────────────────────────│ │ │ │ *** 充電中 (MeterValues) *** │ │ │ │ [5] StopTransaction.req │ │ (meterStop, timestamp, │ │ transactionId, [reason], │ │ [idTag], [transactionData]) │ │────────────────────────────────────>│ │ │ │ [6] StopTransaction.conf │ │ ([idTagInfo]) │ │<────────────────────────────────────│ ``` #### 3.2 StartTransaction.req 詳細 **引用章節**: Section 4.8 (Page 37), Section 6.45 (Page 79) ```json { "connectorId": integer, // 必要,連接器 ID (>0) "idTag": "string[20]", // 必要,用戶識別碼 "meterStart": integer, // 必要,起始電錶讀數 (Wh) "timestamp": "datetime", // 必要,交易開始時間 "reservationId": integer // 選填,預約 ID } ``` #### 3.3 StartTransaction.conf 詳細 ```json { "idTagInfo": { "status": "Accepted|Blocked|Expired|Invalid|ConcurrentTx", "expiryDate": "datetime", "parentIdTag": "string[20]" }, "transactionId": integer // 必要,交易 ID (由 CS 分配) } ``` #### 3.4 StopTransaction.req 詳細 **引用章節**: Section 4.10 (Page 43-44), Section 6.49 (Page 82) ```json { "transactionId": integer, // 必要 "timestamp": "datetime", // 必要 "meterStop": integer, // 必要,結束電錶讀數 (Wh) "idTag": "string[20]", // 選填,停止交易的識別碼 "reason": "enum", // 選填,停止原因 "transactionData": [...] // 選填,交易期間的電錶數據 } ``` **StopTransaction Reason 列舉值**: | Reason | 說明 | |--------|------| | `EmergencyStop` | 緊急停止 | | `EVDisconnected` | EV 斷開連接 | | `HardReset` | 硬重置 | | `Local` | 本地操作(預設) | | `Other` | 其他原因 | | `PowerLoss` | 斷電 | | `Reboot` | 重啟 | | `Remote` | 遠端停止 | | `SoftReset` | 軟重置 | | `UnlockCommand` | 解鎖命令 | | `DeAuthorized` | 取消授權 | --- ### 四、遠端啟動/停止交易 **引用章節**: Section 5.11 (Page 49-50), Section 5.12 (Page 50) #### 4.1 RemoteStartTransaction.req ```json { "idTag": "string[20]", // 必要 "connectorId": integer, // 選填 "chargingProfile": {...} // 選填,TxProfile } ``` **行為受 `AuthorizeRemoteTxRequests` 組態鍵控制**: - `true`: 先執行授權流程再啟動交易 - `false`: 直接嘗試啟動交易(StartTransaction 時再驗證) #### 4.2 RemoteStopTransaction.req ```json { "transactionId": integer // 必要 } ``` --- ### 五、離線行為與未知識別碼授權 **引用章節**: Section 3.5.4 Unknown Offline Authorization (Page 14-15) #### 5.1 相關組態鍵 | 組態鍵 | 說明 | |--------|------| | `LocalAuthorizeOffline` | 離線時是否使用本地授權 | | `LocalPreAuthorize` | 是否在等待 CS 回應前預先授權 | | `AllowOfflineTxForUnknownId` | 離線時是否允許未知識別碼 | | `StopTransactionOnInvalidId` | 無效識別碼時是否停止交易 | | `MaxEnergyOnInvalidId` | 無效識別碼時的最大充電量 | #### 5.2 離線交易恢復流程 ``` 連線恢復後: 1. 發送 StartTransaction.req(離線期間授權的交易) 2. 如果 StartTransaction.conf 的 status ≠ Accepted: - StopTransactionOnInvalidId = true → 停止交易,Reason = DeAuthorized - StopTransactionOnInvalidId = false → 僅停止能量傳輸 ``` --- ### 六、Connector 狀態轉換 **引用章節**: Section 4.9 Status Notification (Page 38-43) ``` Available ─┬─> Preparing ─┬─> Charging ──┬─> Finishing ─> Available │ │ │ │ ├─> SuspendedEV │ │ │ │ │ └─> SuspendedEVSE │ └─> Reserved ──────────────────┘ ``` **關鍵狀態說明**: | 狀態 | 說明 | |------|------| | `Available` | 可用,等待使用者 | | `Preparing` | 準備中(插線或刷卡後) | | `Charging` | 充電中 | | `SuspendedEV` | EV 暫停(電池滿/溫度) | | `SuspendedEVSE` | EVSE 暫停(智慧充電限制) | | `Finishing` | 結束中(等待拔線) | | `Reserved` | 已預約 | | `Unavailable` | 不可用 | | `Faulted` | 故障 | --- ### 七、Transaction-related Messages 處理 **引用章節**: Section 3.7 (Page 17-18) #### 7.1 訊息重試機制 相關組態鍵: - `TransactionMessageAttempts`: 最大重試次數 - `TransactionMessageRetryInterval`: 重試間隔(秒) 重試間隔採用指數退避: ``` 第 1 次重試: RetryInterval 秒後 第 2 次重試: RetryInterval × 2 秒後 第 3 次重試: RetryInterval × 3 秒後 ... ``` #### 7.2 無 transactionId 時的處理 **引用章節**: Errata Sheet Section 3.18 (Page 10) 如果 StartTransaction.req 無法成功傳送或未收到 StartTransaction.conf: - Charge Point 應使用 `transactionId = -1` 發送後續交易相關訊息 - Central System 應正常處理這些訊息 --- ### 八、相關組態鍵總覽 **引用章節**: Chapter 9 Standard Configuration Key Names & Values | 組態鍵 | 類型 | 說明 | |--------|------|------| | `AuthorizeRemoteTxRequests` | boolean | 遠端啟動是否需要授權 | | `LocalAuthorizeOffline` | boolean | 離線時是否本地授權 | | `LocalPreAuthorize` | boolean | 是否預先本地授權 | | `AuthorizationCacheEnabled` | boolean | 是否啟用授權快取 | | `LocalAuthListEnabled` | boolean | 是否啟用本地授權清單 | | `LocalAuthListMaxLength` | integer | 本地授權清單最大長度 | | `StopTransactionOnInvalidId` | boolean | 無效 ID 是否停止交易 | | `StopTransactionOnEVSideDisconnect` | boolean | EV 側斷開是否停止交易 | | `UnlockConnectorOnEVSideDisconnect` | boolean | EV 側斷開是否解鎖 | | `ConnectionTimeOut` | integer | 連接超時(秒) | | `MaxEnergyOnInvalidId` | integer | 無效 ID 最大充電量 (Wh) | --- 讓我搜尋更詳細的規範內容來回答這兩個問題。現在我有完整資訊來回答您的兩個問題。 --- ## 問題一:idTag 識別碼的形式與內容 **引用章節**: Section 3.9 ID Tokens (Page 18), Section 7.28 IdToken (Page 98) ### 1.1 資料類型規格 | 屬性 | 說明 | |------|------| | **類型** | `CiString20Type` (Case Insensitive String) | | **最大長度** | 20 字元 | | **大小寫** | **不區分大小寫** | | **字元集** | 可列印 ASCII 字元 | ### 1.2 常見的 idTag 形式 #### (A) 實體 RFID 卡 UID(最常見) ``` 來源:ISO 14443 相容的 RFID 卡 格式:4 bytes 或 7 bytes 的 UID 表示:8 或 14 個十六進位字元 範例: - 4 bytes UID: "A1B2C3D4" (8 字元) - 7 bytes UID: "04A1B2C3D4E5F6" (14 字元) ``` **規範建議**:依據 ISO14443-3,byte 0 應放在 hex 字串的最前面。 #### (B) 虛擬授權碼 (Virtual Transaction Authorization Code) ``` 用途:遠端啟動交易時由 Central System 發送 特性:可能是一次性使用的授權碼 格式:刻意使用非標準 UID 格式,避免與實體卡 UID 衝突 範例: - "REMOTE_TX_20241210_001" - "APP_AUTH_5A7B9C" - "SMS_CODE_123456" ``` #### (C) 帳號識別碼 (Account Identifier) ``` 用途:作為 ParentIdTag 群組識別 特性:不一定是有效的 idTag,可能是共用帳號編號 範例: - "ACCT_FAMILY_001" - "CORP_FLEET_ABC" - "CONTRACT_12345" ``` ### 1.3 實際範例對照 | 場景 | idTag 範例 | 說明 | |------|-----------|------| | 刷 RFID 卡啟動 | `"04E5C1D2A3B4F5"` | 7-byte UID 十六進位 | | 手機 App 啟動 | `"APP_USER_8821"` | 虛擬授權碼 | | 會員卡 | `"M1234567890"` | 會員編號 | | 車隊管理 | `"FLEET_TRUCK_05"` | 車輛識別 | | 一次性密碼 | `"OTP_983621"` | SMS/App 動態碼 | ### 1.4 重要規範提醒 ``` ⚠️ Charge Point 不得對 idTag 格式做任何假設: - 不能假設必須是十六進位字元 - 不能假設必須是偶數位數 - 必須接受任何符合 CiString20Type 的資料 ⚠️ 比對時不區分大小寫: "A1B2C3D4" 等同於 "a1b2c3d4" ``` --- ## 問題二:Core Profile 組態鍵 (Section 9.1) **引用章節**: Section 9.1 Core Profile (Page 97-105) ### 2.1 Core Profile 組態鍵完整列表 | # | 組態鍵 | 必要性 | R/RW | 類型 | 說明 | |---|--------|--------|------|------|------| | 9.1.1 | `AllowOfflineTxForUnknownId` | 選填 | RW | boolean | 離線時是否允許未知識別碼交易 | | 9.1.2 | `AuthorizationCacheEnabled` | 選填 | RW | boolean | 是否啟用授權快取 | | 9.1.3 | `AuthorizeRemoteTxRequests` | **必填** | R/RW | boolean | 遠端啟動是否需要先授權 | | 9.1.4 | `BlinkRepeat` | 選填 | RW | integer | 燈號閃爍次數 | | 9.1.5 | `ClockAlignedDataInterval` | **必填** | RW | integer (秒) | 時鐘對齊資料間隔 (0=停用) | | 9.1.6 | `ConnectionTimeOut` | **必填** | RW | integer (秒) | Preparing 狀態超時時間 | | 9.1.7 | `ConnectorPhaseRotation` | **必填** | RW | CSL | 各連接器相位旋轉設定 | | 9.1.8 | `ConnectorPhaseRotationMaxLength` | 選填 | R | integer | 上項最大項目數 | | 9.1.9 | `GetConfigurationMaxKeys` | **必填** | R | integer | GetConfiguration 最大鍵數 | | 9.1.10 | `HeartbeatInterval` | **必填** | RW | integer (秒) | 心跳間隔 | | 9.1.11 | `LightIntensity` | 選填 | RW | integer (%) | 燈光亮度百分比 | | 9.1.12 | `LocalAuthorizeOffline` | **必填** | RW | boolean | 離線時是否使用本地授權 | | 9.1.13 | `LocalPreAuthorize` | **必填** | RW | boolean | 是否預先本地授權(不等 CS 回應) | | 9.1.14 | `MaxEnergyOnInvalidId` | 選填 | RW | integer (Wh) | 無效 ID 時最大充電量 | | 9.1.15 | `MeterValuesAlignedData` | **必填** | RW | CSL | 時鐘對齊電錶量測項目 | | 9.1.16 | `MeterValuesAlignedDataMaxLength` | 選填 | R | integer | 上項最大項目數 | | 9.1.17 | `MeterValuesSampledData` | **必填** | RW | CSL | 取樣電錶量測項目 | | 9.1.18 | `MeterValuesSampledDataMaxLength` | 選填 | R | integer | 上項最大項目數 | | 9.1.19 | `MeterValueSampleInterval` | **必填** | RW | integer (秒) | 電錶取樣間隔 (0=停用) | | 9.1.20 | `MinimumStatusDuration` | 選填 | RW | integer (秒) | 狀態通知最小持續時間 | | 9.1.21 | `NumberOfConnectors` | **必填** | R | integer | 實體連接器數量 | | 9.1.22 | `ResetRetries` | **必填** | RW | integer | 重置重試次數 | | 9.1.23 | `StopTransactionOnEVSideDisconnect` | **必填** | RW | boolean | EV 側拔線是否停止交易 | | 9.1.24 | `StopTransactionOnInvalidId` | **必填** | RW | boolean | 無效 ID 是否停止交易 | | 9.1.25 | `StopTxnAlignedData` | **必填** | RW | CSL | StopTx 時鐘對齊資料項目 | | 9.1.26 | `StopTxnAlignedDataMaxLength` | 選填 | R | integer | 上項最大項目數 | | 9.1.27 | `StopTxnSampledData` | **必填** | RW | CSL | StopTx 取樣資料項目 | | 9.1.28 | `StopTxnSampledDataMaxLength` | 選填 | R | integer | 上項最大項目數 | | 9.1.29 | `SupportedFeatureProfiles` | **必填** | R | CSL | 支援的功能 Profile 清單 | | 9.1.30 | `SupportedFeatureProfilesMaxLength` | 選填 | R | integer | 上項最大項目數 | | 9.1.31 | `TransactionMessageAttempts` | **必填** | RW | integer | 交易訊息重試次數 | | 9.1.32 | `TransactionMessageRetryInterval` | **必填** | RW | integer (秒) | 交易訊息重試間隔 | | 9.1.33 | `UnlockConnectorOnEVSideDisconnect` | **必填** | RW | boolean | EV 側拔線是否解鎖連接器 | | 9.1.34 | `WebSocketPingInterval` | 選填 | RW | integer (秒) | WebSocket Ping 間隔 (0=停用) | > **CSL** = Comma Separated List(逗號分隔清單) --- ## 問題二補充:SendLocalList 的 Full 與 Differential 更新模式 **引用章節**: Section 5.15 Send Local List (Page 52-53), Section 7.48 UpdateType (Page 95) ### 完整更新 (Full Update) vs 差異更新 (Differential Update) ``` ┌─────────────────────────────────────────────────────────────────────┐ │ Full Update (完整更新) │ ├─────────────────────────────────────────────────────────────────────┤ │ 行為:完全取代 Charge Point 現有的 Local Authorization List │ │ 適用:首次同步、清單嚴重不一致、定期完整同步 │ │ │ │ Central System 現有清單: Charge Point 更新後: │ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │ │ idTag: A → Accepted │ │ idTag: A → Accepted │ │ │ │ idTag: B → Blocked │ ─► │ idTag: B → Blocked │ │ │ │ idTag: C → Accepted │ │ idTag: C → Accepted │ │ │ └──────────────────────┘ └──────────────────────┘ │ │ (舊清單完全被新清單取代) │ └─────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ Differential Update (差異更新) │ ├─────────────────────────────────────────────────────────────────────┤ │ 行為:只更新有變動的項目(新增、修改、刪除) │ │ 適用:日常維護、小量變更、節省傳輸資料量 │ │ │ │ Charge Point 原有清單: 差異更新內容: 更新後結果: │ │ ┌──────────────────────┐ ┌────────────────┐ ┌──────────────────┐│ │ │ idTag: A → Accepted │ │ B → Expired │ │ A → Accepted ││ │ │ idTag: B → Accepted │ + │ D → Accepted │ = │ B → Expired (改) ││ │ │ idTag: C → Accepted │ │ C → (刪除) │ │ D → Accepted(新) ││ │ └──────────────────────┘ └────────────────┘ └──────────────────┘│ │ │ │ ⚠️ 刪除操作:發送 idTag 但不包含 idTagInfo │ └─────────────────────────────────────────────────────────────────────┘ ``` ### SendLocalList.req 訊息結構 ```json { "listVersion": 239, // 必填:更新後的版本號 "updateType": "Differential", // 必填:"Full" 或 "Differential" "localAuthorizationList": [ // 選填:授權清單項目 { "idTag": "A1B2C3D4", // 必填:識別碼 "idTagInfo": { // 選填:授權資訊 (差異更新時省略=刪除) "status": "Accepted", "expiryDate": "2025-12-31T23:59:59Z", "parentIdTag": "PARENT_001" } }, { "idTag": "E5F6G7H8" // 只有 idTag,沒有 idTagInfo = 刪除此項 } ] } ``` ### 差異更新的三種操作 | 操作 | 條件 | 說明 | |------|------|------| | **新增** | idTag 不存在於 CP | 將項目加入清單 | | **修改** | idTag 已存在於 CP,有 idTagInfo | 更新該項目的授權狀態 | | **刪除** | idTag 已存在於 CP,**無** idTagInfo | 從清單移除該項目 | ### SendLocalList.conf 回應狀態 | Status | 說明 | |--------|------| | `Accepted` | 成功更新本地授權清單 | | `Failed` | 更新失敗 | | `NotSupported` | Charge Point 不支援本地授權清單 | | `VersionMismatch` | 差異更新時版本號錯誤(≤ 現有版本) | ### 版本號管理規則 ``` 版本號機制: - listVersion = 0 → 清單為空 - listVersion = -1 → 不支援本地授權清單 - 差異更新時,新版本號必須 > 現有版本號 - 版本號由 Central System 管理,Charge Point 只負責儲存 流程範例: 1. CS 發送 GetLocalListVersion.req 2. CP 回應 listVersion: 234 3. CS 計算差異,發送 SendLocalList.req (listVersion: 235, updateType: Differential) 4. 如果 CP 回應 VersionMismatch → CS 應改用 Full 更新 ``` ### 最佳實務建議 ``` ✅ 建議做法: 1. 定期(如每天)執行 Full 更新確保一致性 2. 日常變更使用 Differential 更新減少傳輸量 3. Differential 失敗時自動 fallback 到 Full 更新 4. 監控 LocalListConflict 錯誤(StatusNotification, errorCode) ⚠️ 注意事項: - LocalAuthListMaxLength 限制清單最大項目數 - SendLocalListMaxLength 限制單次傳送最大項目數 - 清單應儲存在非揮發性記憶體,重啟後保留 ``` --- 這兩個欄位的意義如下: --- ## R/RW(Accessibility 存取權限) **引用章節**: Section 9 Standard Configuration Key Names & Values (Page 96) | 值 | 全稱 | 意義 | Central System 可執行的操作 | |----|------|------|---------------------------| | **R** | Read-only | 唯讀 | 只能用 `GetConfiguration.req` 讀取,**不能**用 `ChangeConfiguration.req` 修改 | | **RW** | Read-Write | 可讀寫 | 可用 `GetConfiguration.req` 讀取,也可用 `ChangeConfiguration.req` 修改 | ### 實際範例 ``` 唯讀 (R) 的組態鍵: ┌─────────────────────────┬────────────────────────────────────┐ │ NumberOfConnectors │ 實體連接器數量 - 硬體決定,不可改 │ │ SupportedFeatureProfiles│ 支援的功能 - 韌體決定,不可改 │ │ LocalAuthListMaxLength │ 清單最大長度 - 記憶體限制,不可改 │ └─────────────────────────┴────────────────────────────────────┘ 可讀寫 (RW) 的組態鍵: ┌─────────────────────────┬────────────────────────────────────┐ │ HeartbeatInterval │ 心跳間隔 - 營運需求可調整 │ │ MeterValueSampleInterval│ 電錶取樣間隔 - 依需求可調整 │ │ LocalAuthorizeOffline │ 離線授權開關 - 政策可調整 │ └─────────────────────────┴────────────────────────────────────┘ ``` ### 特殊情況:R or RW 有些組態鍵標示為 `R or RW`,表示由 Charge Point 製造商決定: ``` AuthorizeRemoteTxRequests: R or RW - 有些 CP 實作為唯讀(出廠固定) - 有些 CP 實作為可讀寫(允許營運商調整) ``` --- ## 類型(Type 資料型態) | 類型 | 說明 | 範例值 | |------|------|--------| | **boolean** | 布林值,只有 true 或 false | `true`, `false` | | **integer** | 整數 | `60`, `300`, `0`, `-1` | | **CSL** | Comma Separated List,逗號分隔清單 | `"Core,SmartCharging,LocalAuthListManagement"` | | **String** | 字串 | `"0.RST,1.RST,2.RTS"` | ### 各類型詳細說明 #### boolean(布林值) ```json // GetConfiguration.conf 回傳範例 { "key": "LocalAuthorizeOffline", "readonly": false, "value": "true" // 注意:在 OCPP 中以字串形式傳輸 } // ChangeConfiguration.req 設定範例 { "key": "LocalAuthorizeOffline", "value": "false" } ``` #### integer(整數) ```json // 範例:設定心跳間隔為 60 秒 { "key": "HeartbeatInterval", "value": "60" // 以字串形式傳輸 } // 範例:設定電錶取樣間隔為 0(停用) { "key": "MeterValueSampleInterval", "value": "0" } ``` #### CSL(逗號分隔清單) ```json // 範例:支援的功能 Profile { "key": "SupportedFeatureProfiles", "readonly": true, "value": "Core,FirmwareManagement,LocalAuthListManagement,SmartCharging" } // 範例:電錶取樣資料項目 { "key": "MeterValuesSampledData", "readonly": false, "value": "Energy.Active.Import.Register,Power.Active.Import,Current.Import,Voltage" } // 範例:連接器相位旋轉 { "key": "ConnectorPhaseRotation", "readonly": false, "value": "0.RST,1.RST,2.RST" // 格式: connectorId.PhaseRotation } ``` ### CSL 相關的 MaxLength 組態鍵 對於 CSL 類型的組態鍵,通常會有對應的 `MaxLength` 鍵來告知最大項目數: ``` MeterValuesSampledData (CSL) └── MeterValuesSampledDataMaxLength (integer) = 最多幾個項目 若 MaxLength 鍵不存在,應假設安全值為 1 ``` --- ## 組態鍵操作流程圖 ``` ┌─────────────────────────────────────────────────────────────────┐ │ GetConfiguration.req │ │ (讀取組態鍵) │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Central System Charge Point │ │ │ │ │ │ │ GetConfiguration.req([key]) │ │ │ │──────────────────────────────────────>│ │ │ │ │ │ │ │ GetConfiguration.conf │ │ │ │ (configurationKey, [unknownKey]) │ │ │ │<──────────────────────────────────────│ │ │ │ │ 回應內容: │ │ { │ │ "configurationKey": [ │ │ { │ │ "key": "HeartbeatInterval", │ │ "readonly": false, ← 表示這是 RW │ │ "value": "60" │ │ }, │ │ { │ │ "key": "NumberOfConnectors", │ │ "readonly": true, ← 表示這是 R │ │ "value": "2" │ │ } │ │ ] │ │ } │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ ChangeConfiguration.req │ │ (修改組態鍵 - 僅限 RW) │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Central System Charge Point │ │ │ │ │ │ │ ChangeConfiguration.req │ │ │ │ (key, value) │ │ │ │──────────────────────────────────────>│ │ │ │ │ │ │ │ ChangeConfiguration.conf(status) │ │ │ │<──────────────────────────────────────│ │ │ │ │ 可能的回應狀態: │ │ ┌────────────────┬─────────────────────────────────────────┐ │ │ │ Accepted │ 成功套用,立即生效 │ │ │ │ Rejected │ 拒絕(值超出範圍、格式錯誤等) │ │ │ │ RebootRequired │ 成功套用,但需重啟才生效 │ │ │ │ NotSupported │ 不認識這個 key │ │ │ └────────────────┴─────────────────────────────────────────┘ │ │ │ │ ⚠️ 如果對 readonly=true 的鍵發送 ChangeConfiguration: │ │ → 回應 Rejected 或 NotSupported │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## 快速參照表 | 縮寫 | 意義 | 可讀取 | 可修改 | |------|------|:------:|:------:| | R | Read-only | ✅ | ❌ | | RW | Read-Write | ✅ | ✅ | | 類型 | 傳輸格式 | 值域範例 | |------|----------|----------| | boolean | 字串 `"true"` / `"false"` | `true`, `false` | | integer | 字串形式的數字 | `"0"`, `"60"`, `"-1"` | | CSL | 逗號分隔的字串 | `"A,B,C"` |
{"title":"OCPP 1.6 授權與交易流程詳解","description":"我來搜尋 OCPP 規範中關於授權和交易流程的詳細內容。讓我繼續查閱 OCPP 1.6 主規範文件,以獲取更完整的章節引用。根據 OCPP 1.6 Edition 2 規範和 Errata Sheet 的內容,我為您整理出完整的授權與交易流程詳細說明。","contributors":"[{\"id\":\"8805d760-20df-4ce4-9e48-53578a98c68c\",\"add\":22189,\"del\":0,\"latestUpdatedAt\":1765349114082}]"}
Expand menu