emqx/apps/emqx_gateway_ocpp/README-cn.md

7.2 KiB
Raw Permalink Blame History

emqx-ocpp

OCPP-J 1.6 协议的 Central System 实现。

客户端信息映射

在 EMQX 4.x 中OCPP-J 网关作为协议插件或协议模块(仅企业版本)进行提供。

所有连接到 OCPP-J 网关的 Charge Point都会被当做一个普通的客户端对待就像 MQTT 客户端一样)。 即可以使用 Charge Point 的唯一标识,在 Dashboard/HTTP-API/CLI 来管理它。

客户端信息的映射关系为:

  • Client IDCharge Point 的唯一标识。
  • Username从 HTTP Basic 认证中的 Username 解析得来。
  • Password从 HTTP Basic 认证中的 Password 解析得来。

认证

正如 ocpp-j-1.6 规范中提到的Charge Point 可以使用 HTTP Basic 进行认证。 OCPP-J 网关从中提取 Username 和 Password并通过 EMQX 的认证系统获取登录权限。

也就是说OCPP-J 网关使用 EMQX 的认证插件来授权 Charge Point 的登录。

消息拓扑

                                +----------------+  upstream publish  +---------+
+--------------+   Req/Resp     | OCPP-J Gateway | -----------------> | Third   |
| Charge Point | <------------> | over           |     over Topic     | Service |
+--------------+   over ws/wss  | EMQX           | <----------------- |         |
                                +----------------+  dnstream publish  +---------+

Charge Point 和 OCPP-J 网关通过 OCPP-J 协议定义的规范进行通信。这主要是基于 Websocket 和 Websocket TLS

Up Stream (emqx-ocpp -> third-services)

OCPP-J 网关将 Charge Point 所有的消息、事件通过 EMQX 进行发布。这个数据流称为 Up Stream

其主题配置支持按任意格式进行配置,例如:

## 上行默认主题。emqx-ocpp 网关会将所有 Charge Point 的消息发布到该主题上。
##
## 可用占位符为:
## - cid: Charge Point ID
## - action: The Message Name for OCPP
##
ocpp.upstream.topic = ocpp/cp/${cid}/${action}

## 支持按消息名称对默认主题进行重载
##
ocpp.upstream.topic.BootNotification = ocpp/cp/${cid}/Notify/${action}

Payload 为固定格式,它包括字段

Field Type Seq Required Desc
MessageTypeId MessageType 1 R Define the type of Message, whether it is Call, CallResult or CallError
UniqueId String 2 R This must be the exact same id that is in the call request so that the recipient can match request and result
Action String 3 O The Message Name of OCPP. E.g. Authorize
ErrorCode ErrorType 4 O The string must contain one from ErrorType Table
ErrorDescription String 5 O Detailed Error information
Payload Bytes 6 O Payload field contains the serialized strings of bytes for protobuf format of OCPP message

例如,一条在 upstream 上的 BootNotifiaction.req 的消息格式为:

Topic: ocpp/cp/CP001/Notify/BootNotifiaction
Payload:
  {"MessageTypeId": 2,
   "UniqueId": "1",
   "Payload": {"chargePointVendor":"vendor1","chargePointModel":"model1"}
  }

同样,对于 Charge Point 发送到 Central System 的 *.conf 的应答消息和错误通知, 也可以定制其主题格式:

ocpp.upstream.reply_topic = ocpp/cp/Reply/${cid}

ocpp.upstream.error_topic = ocpp/cp/Error/${cid}

Up Stream 消息的 QoS 等级固定为 2即最终接收的 QoS 等级取决于订阅者发起订阅时的 QoS 等级。

Down Stream (third-services -> emqx-ocpp)

OCPP-J 网关通过向 EMQX 订阅主题来接收控制消息,并将它转发的对应的 Charge Point以达到消息下发的效果。 这个数据流被称为 Down Stream

其主题配置支持按任意格式进行配置,例如:

## 下行主题。网关会为每个连接的 Charge Point 网关自动订阅该主题,
## 以接收下行的控制命令等。
##
## 可用占位符为:
## - cid: Charge Point ID
##
## 注1. 为了区分每个 Charge Point所以 ${cid} 是必须的
##     2. 通配符 `+` 不是必须的,此处仅是一个示例
ocpp.dnstream.topic = ocpp/${cid}/+/+

Payload 为固定格式,格式同 upstream。

例如,一条从 Third-Service 发到网关的 BootNotifaction 的应答消息格式为:

Topic: ocpp/cp/CP001/Reply/BootNotification
Payload:
  {"MessageTypeId": 3,
   "UniqueId": "1",
   "Payload": {"currentTime": "2022-06-21T14:20:39+00:00", "interval": 300, "status": "Accepted"}
  }

消息收发机制

正如 OCPP-J 协议所说Charge Point 和 Central System 在发送出一条请求消息CALL都必须等待该条消息被应答或者超时后才能发送下一条消息。

网关在实现上,支持严格按照 OCPP-J 定义的通信逻辑执行,也支持不执行该项检查。

ocpp.upstream.strit_mode = false
ocpp.dnstream.strit_mode = false

upstream.strit_mode = false 时,只要 Charge Point 有新的消息到达,都会被发布到 upsteam 的主题上。dnstream.strit_mode = false 时,只要 Third-Party 有新的消息发布到 dnstream都会被里面转发到 Charge Point 上。

注:当前版本,仅支持 strit_mode = false

Up Stream (Charge Point -> emqx-ocpp)

upstream.strit_mode = true 时, OCPP-J 网关处理 Up Stream 的行为:

  • 收到的请求消息会立马发布到 Up Stream 并保存起来,直到 Down Stream 上得到一个该消息的应答、或答超时后才会被移除。但应答和错误消息不会被暂存。
  • 如果上一条请求消息没有被应答或超时,后续收到的请求消息都会被 OCPP-J 网关丢弃并回复一个 SecurityError 错误。但如果这两条请求消息相同,则会在 Up Stream 上被重新发布。
  • 当请求消息被应答或超时后,才会处理下一条请求消息。
  • Charge Point 发送的应答和错误消息会立马发布到 Up Stream不会被暂存也不会阻塞下一条应答和错误消息。

相关配置有:

# 上行请求消息,最大的应答等待时间
ocpp.upstream.awaiting_timeout = 30s

Down Stream (Third-services -> emqx-ocpp)

upstream.strit_mode = trueDown Stream 的行为:

  • 下行请求消息会先暂存到网关,直到它被 Charge Point 应答。
  • 多条下行请求消息会被暂存到网关的发送队列中,直到上一条请求消息被确认才会发布下一条请求消息。
  • 下行的应答和错误消息,会尝试确认 Charge Point 发送的请求消息。无论是否确认成功,该消息都会立马投递到 Charge Point并不会在消息队列里排队。
  • 下行的请求消息不会被丢弃,如果等待超时则会重发该请求消息,直到它被确认。

相关配置有:

# 下行请求消息重试间隔
ocpp.dnstream.retry_interval = 30s

# 下行请求消息最大队列长度
ocpp.dnstream.max_mqueue_len = 10

消息格式检查

网关支持通过 Json-Schema 来校验每条消息 Payload 的合法性。

## 检查模式
#ocpp.message_format_checking = all

## json-schema 文件夹路径
#ocpp.json_schema_dir = ${application_priv}/schemas

## json-schema 消息前缀
#ocpp.json_schema_id_prefix = urn:OCPP:1.6:2019:12: