|
| 1 | +## OCPP 简介 |
| 2 | + |
| 3 | +**开放充电桩协议**(Open Charge Point Protocol, OCPP)是一种应用协议,旨在实现电动汽车充电站与中央管理系统之间的通信,通过交换充电会话、状态更新和其他操作数据,促进充电业务的高效管理。 |
| 4 | + |
| 5 | +作为电动汽车充电站与中央管理系统之间的事实标准,OCPP 在电动汽车充电行业的采用率显著上升。许多国家和公司正在将 OCPP 纳入其基础设施,以确保电动汽车充电网络的无缝衔接和扩展。 |
| 6 | + |
| 7 | +OCPP 协议标准化了信息交换,支持多种操作: |
| 8 | + |
| 9 | +1. **启动通知**:充电桩连接到中央系统时发送启动通知,进行自我注册并提供初始状态信息。 |
| 10 | +2. **心跳**:充电桩定期向中央系统发送心跳信息,以表明其仍处于连接和运行状态。 |
| 11 | +3. **授权**:充电会话开始前,充电桩向中央系统发送授权请求,以验证用户或车辆身份。 |
| 12 | +4. **启动和停止交易**:充电桩报告充电会话的开始和结束,提供仪表读数、会话持续时间和能源消耗等数据。 |
| 13 | +5. **状态通知**:充电桩发送状态更新,告知中央系统其当前状态,如可用、占用或故障。 |
| 14 | +6. **固件管理**:中央系统可通过发送更新命令来管理充电桩的固件。 |
| 15 | +7. **数据传输**:该协议支持在充电桩和中央系统之间传输各种运行数据,以便进行监控和分析。 |
| 16 | + |
| 17 | +这些操作可确保中央系统能够有效地监测、控制和管理电动汽车充电站网络。 |
| 18 | + |
| 19 | +OCPP 协议通过两种规范在网络上传输信息: |
| 20 | + |
| 21 | +- **OCPP-J**:通过 WebSockets 使用 JSON 进行 OCPP 通信。具体的 OCPP 版本以 J 扩展名标示,如 OCPP1.6J 表示 1.6 版的 JSON/WebSockets 实现。 |
| 22 | +- **OCPP-S**:通过 SOAP 和 HTTP 进行 OCPP 通信。从 1.6 版本开始,S 必须明确标示。旧版本默认使用 S(除非另有说明),例如 OCPP 1.5 与 OCPP1.5S 相同。 |
| 23 | + |
| 24 | +OCPP-J 规范中的 `BootNotification.req` 消息格式如下: |
| 25 | + |
| 26 | +```js |
| 27 | +[ |
| 28 | + // MessageTypeId, 2 表示这是客户端向服务器发送的请求消息 |
| 29 | + 2, |
| 30 | + // UniqueId,消息的唯一 ID,用于标识消息 |
| 31 | + "19223201", |
| 32 | + // 操作,表示传输的信息类型 |
| 33 | + "BootNotification", |
| 34 | + // 有效载荷,信息正文 |
| 35 | + {"chargePointVendor": "VendorX", "chargePointModel": "SingleSocketCharger"} |
| 36 | +] |
| 37 | +``` |
| 38 | + |
| 39 | +## EMQX 5 中的 OCPP 网关 |
| 40 | + |
| 41 | +EMQX 是一个可以无限连接、任意集成、随处运行的大规模分布式物联网 MQTT 接入平台。它提供了一个多协议网关,用于处理所有非 MQTT 协议的连接、身份验证和消息收发。 |
| 42 | + |
| 43 | +> 有关 EMQX 多协议网关的更多信息,请参阅:[EMQX 5.0 全新网关框架:轻松实现多物联网协议接入](https://www.emqx.com/zh/blog/emqx-connects-multiple-iot-protocols) |
| 44 | +
|
| 45 | +EMQX 5 中提供了一个支持 OCPP-J 1.6 协议的 OCPP 网关: |
| 46 | + |
| 47 | + |
| 48 | + |
| 49 | +其工作原理如下: |
| 50 | + |
| 51 | +- OCPP 网关启动一个 WebSocket 服务器端口,处理所有充电桩设备的连接、信息接收和信息传送。 |
| 52 | +- **第三方服务**是由用户实现的后端服务,它根据 MQTT 消息传递模式处理 OCPP 请求。 |
| 53 | +- OCPP 网关将来自设备的所有上行信息转换为相应的 [MQTT 主题](https://www.emqx.com/zh/blog/advanced-features-of-mqtt-topics)和有效载荷,并将其发送至第三方服务。同时,它接收来自第三方服务的 MQTT 控制消息,将其转换为 OCPP 格式消息,并发送到相应的充电桩。 |
| 54 | + |
| 55 | +本文将介绍如何使用 EMQX 5.0 中的 OCPP 网关集成 OCPP 设备,实现不同制造商和服务提供商之间的互操作性。 |
| 56 | + |
| 57 | +## 配置 OCPP 网关 |
| 58 | + |
| 59 | +首先,我们要安装最新的 EMQX Enterprise。请参阅 [EMQX Enterprise 入门指南| EMQX Enterprise 文档](https://docs.emqx.com/zh/emqx/latest/getting-started/getting-started.html#%E5%AE%89%E8%A3%85-emqx)。 |
| 60 | + |
| 61 | +或者,也可以直接使用以下命令,通过 Docker 启动最新版本的 EMQX 容器: |
| 62 | + |
| 63 | +```bash |
| 64 | +docker run -p 18083:18083 -p 1883:1883 -p 33033:33033 emqx/emqx-enterprise:latest |
| 65 | +``` |
| 66 | + |
| 67 | +在 EMQX 仪表板,点击左侧导航菜单中的**管理** -> **网关**。在**网关**页面上,列出了所有支持的网关。找到 **OCPP**,然后单击**操作**列中的 **配置**。接下来,将进入**初始化 OCPP** 页面。 |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | +为了简化配置过程,EMQX 为**网关**页面上的所有必填字段提供了默认值。我们只需要: |
| 72 | + |
| 73 | +1. 将`消息格式检查`改为`Disable`。 |
| 74 | +2. 在**基本参数**选项卡中点击**下一步**,接受所有默认设置。 |
| 75 | +3. 然后,您将被引导至**监听器**选项卡,EMQX 已预先配置了一个 33033 端口的 WebSocket 监听器。再次单击**下一步**确认设置。 |
| 76 | +4. 最后,单击**启用**按钮激活 OCPP 网关。 |
| 77 | + |
| 78 | +完成网关激活过程后,返回**网关**页面,可以看到 OCPP 网关现在显示**启用**状态。 |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | +## 连接 OCPP 客户端 |
| 83 | + |
| 84 | +OCPP 网关启动后,可以使用 OCPP 客户端工具来测试连接,并验证设置是否正确。 |
| 85 | + |
| 86 | +以 ocpp-go 为例,以下是如何在 EMQX 中将 [**ocpp-go**](https://github.com/lorenzodonini/ocpp-go) 客户端连接到 OCPP 网关的步骤。 |
| 87 | + |
| 88 | +首先,准备一个 MQTT 客户端用于与 OCPP 网关交互。例如,使用 [**MQTTX**](https://mqttx.app/zh/downloads),配置其连接到 EMQX 并订阅主题 `ocpp/#`。 |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | +然后,运行 ocpp-go 客户端并与 OCPP 网关建立连接。 |
| 93 | + |
| 94 | +**注**:请将以下命令中的 `<host>` 替换为 EMQX 服务器的地址。 |
| 95 | + |
| 96 | +```bash |
| 97 | +docker run -e CLIENT_ID=chargePointSim -e CENTRAL_SYSTEM_URL=ws://<host>:33033/ocpp -it --rm --name charge-point ldonini/ocpp1.6-charge-point:latest |
| 98 | +``` |
| 99 | + |
| 100 | +连接成功后,将看到类似以下的日志输出: |
| 101 | + |
| 102 | +```bash |
| 103 | +INFO[2023-12-01T03:08:39Z] connecting to server logger=websocketINFO[2023-12-01T03:08:39Z] connected to server as chargePointSim logger=websocketINFO[2023-12-01T03:08:39Z] connected to central system at ws://172.31.1.103:33033/ocppINFO[2023-12-01T03:08:39Z] dispatched request 1200012677 to server logger=ocppj |
| 104 | +``` |
| 105 | + |
| 106 | +接下来,检查 MQTTX 是否收到如下格式的消息: |
| 107 | + |
| 108 | +```js |
| 109 | +Topic: ocpp/cp/chargePointSim |
| 110 | +Payload |
| 111 | +{ |
| 112 | + "UniqueId": "1200012677", |
| 113 | + "Payload": { |
| 114 | + "chargePointVendor": "vendor1", |
| 115 | + "chargePointModel": "model1" |
| 116 | + }, |
| 117 | + "Action": "BootNotification" |
| 118 | +} |
| 119 | +``` |
| 120 | + |
| 121 | +此消息表示 ocpp-go 客户端已连接到 OCPP 网关并发起了 `BootNotification` 请求。 |
| 122 | + |
| 123 | +在 MQTTX 中,向主题 `ocpp/cs/chargePointSim` 发送包含以下内容的消息。 |
| 124 | + |
| 125 | +**注**:请将 `UniqueId` 替换为上一条消息中收到的 UniqueId。 |
| 126 | + |
| 127 | +```json |
| 128 | +{ |
| 129 | + "MessageTypeId": 3, |
| 130 | + "UniqueId": "***", |
| 131 | + "Payload": { |
| 132 | + "currentTime": "2023-12-01T14:20:39+00:00", |
| 133 | + "interval": 300, |
| 134 | + "status": "Accepted" |
| 135 | + }, |
| 136 | + "Action": "BootNotification" |
| 137 | +} |
| 138 | +``` |
| 139 | + |
| 140 | +随后,MQTTX 将收到一条 `StatusNotification` 状态报告。这表明 OCPP 客户端已成功与 OCPP 网关建立连接。 |
| 141 | + |
| 142 | +```js |
| 143 | +Topic: ocpp/cp/chargePointSim |
| 144 | + |
| 145 | +Payload: |
| 146 | +{ |
| 147 | + "UniqueId": "3062609974", |
| 148 | + "Payload": { |
| 149 | + "status": "Available", |
| 150 | + "errorCode": "NoError", |
| 151 | + "connectorId": 0 |
| 152 | + }, |
| 153 | + "MessageTypeId": 2, |
| 154 | + "Action": "StatusNotification" |
| 155 | +} |
| 156 | +``` |
| 157 | + |
| 158 | +至此,OCPP 客户端已成功连接到 EMQX 的 OCPP 网关,并与第三方服务进行了通信。 |
| 159 | + |
| 160 | +## 结语 |
| 161 | + |
| 162 | +EMQX 5.0 的 OCPP 网关可以实现 OCPP 设备的轻松接入,为构建统一的电动汽车充电网络提供了便利。企业从而可以高效监控和管理其电动汽车充电基础设施,为实现更具可持续性和互联性的未来铺平道路。 |
0 commit comments