Skip to content

发布/订阅 MQTT 消息

概述

MQTT 是一种轻量级、开放和简单的订阅者/发布者消息传输协议,被认为是在需要小代码占用空间和/或网络带宽稀缺的应用程序中的一个很好的解决方案。它特别适用于连续监测诸如温度、压力、水位、能源监测等传感器数据。

发布者、订阅者和代理是 MQTT 协议中的三个重要角色。如下图所示,当发布者向代理发布消息时,代理将将消息传递给订阅者。

Weintek HMI 和 MQTT

HMI 从 PLC 处理数据并将消息发布到 MQTT 代理,代理将处理消息传递给订阅者。通过这种方式,即使 HMI 位于防火墙后且难以访问 HMI,也可以进行消息发布。

另外,MQTT 消息可以内部发布到内置的 MQTT 代理。也就是说,不需要外部代理;可以使用 MQTT 客户端直接订阅 HMI 内部的 MQTT 代理并接收消息更新!只要 MQTT 客户端可以直接连接到 HMI,例如通过 VPN 或 EasyAccess 2.0,就可以实现这种方案。

EasyBuilder Pro 设置

在 EasyBuilder Pro 中,点击 [对象] » [MQTT] 来设置项目中的 MQTT。

服务器设置

首先,必须输入 MQTT 服务器信息。服务器的 IP 地址或域名是代理的 IP 地址或域名。当使用本地地址(127.0.0.1)时,消息将被发布到 HMI 中的内置代理。要通过域名指定代理,请选择 [使用域名],然后在 IP 字段中输入域名。为了防止未经授权的订阅者连接到服务器,请选择 [身份验证] 复选框。选择此复选框后,连接 MQTT 服务器将需要用户名和密码。在 [自动连接] 模式下,如果在指定的时间段内没有数据更新,连接将自动断开。主题列表显示当前 HMI 上可以订阅的主题。为了避免每次连接服务器时都发布主题列表,请选择 [仅在第一次发布主题列表]。

可以指定 LW 地址以在 HMI 运行时动态控制 MQTT 或显示 MQTT 状态。在指定地址后,其相对地址(+1、+2、+3 等)将对应不同的属性或参数,如下图所示的 EasyBuilder Pro 设置对话框。例如,如果将 MQTT_STATUS 设置为 LW-110,则 LW-110 显示状态,LW-111 显示错误代码。

未发送的消息存储在缓冲区中。缓冲区的最大容量为 10000 条消息。当缓冲区已满时,将删除最早的消息。

启用 TLS/SSL 认证会打开两种验证方法:

  • [服务器验证]:验证服务器证书是否由 CA(证书颁发机构)证书签名。
  • [客户端验证]:通过提供私钥和证书,服务器可以更快地验证客户端,跳过用户名或密码登录。

默认消息

当 HMI 是发布者并且首次连接到代理时,将从 HMI 发送两个默认主题,以 QoS2 发布。

  1. iot-2/type/mt/id/[client id]/evt/topics_update/fmt/json 此主题包含从 HMI 发送的消息,并显示消息是否已压缩。

  2. iot-2/type/mt/id/[client id]/evt/status/fmt/json 此主题显示 HMI 和代理之间的连接状态。

主题发布者设置

设置 MQTT 服务器后,打开 MQTT 主题设置。每个主题包含要发送的多条消息。

主题的名称可以由用户定义,并且可以在主题名称中使用字符 % 后跟特定代码来使用 HMI 名称/服务器设置。

例如:iot-2/type/cMT-SVR/id/%0/evt/topic 1/fmt/json

%0 代表 HMI 名称。要查找 HMI 名称,请在 HMI 上打开系统设置,或使用系统寄存器 LW-10884。如果 HMI 名称为“Default HMI”,则主题应写为:iot-2/type/cMT-SVR/id/Default HMI/evt/topic 1/fmt/json

发送模式:如果选择基于触发的模式,则 MQTT 消息在主题中的任何值更改时发送。如果选择基于时间的模式,则数据将按固定时间间隔发布。

除了地址发送模式外,当创建事件日志时,在 MQTT 主题发布者设置对话框中可以找到 [事件日志] 选项。

当发送模式为 [地址] 时,在地址选项卡中,设置将包含在主题中的数据组合。地址可以是连续的或非连续的,可以是不同的数据类型和长度。

MQTT 提供三个可靠性级别,称为服务质量(QoS)。消息的可靠性决定了消息的持久性。

  • 0:至多一次,消息不持久。
  • 1:至少一次。
  • 2:仅一次。

有关 QoS 的更多信息,请点击此处

[压缩传输]:在发送之前将消息压缩,读取消息之前需要解压缩。MQTT 中的消息使用 DEFLATE 算法进行压缩/解压缩。

[内容格式]:支持的格式有:JSON 和原始数据。

下面是一个显示 JSON 和原始数据之间差异的示例。

当在以下地址格式中发布四个值时:

JSON:

json
{
  "d" : {
    "value 1" : [ false ],
    "value 2" : [ 2 ],
    "value 3" : [ 1.20000005, 0, 0, 0, 0 ],
    "value 4" : [ "ABCD" ]
  },
  "ts" : "2017-04-18T17:36:52.501856"
}

原始数据:

0002 009A 9999 3F00 0000 0000 0000 0000

0000 0000 0000 0041 4243 4400 0000 00

订阅者设置

您可以从其他 MQTT 服务器订阅主题。设置与前面章节中演示的发布者设置类似。不支持订阅事件日志。

内容格式可以是 JSON 或原始数据,请选择发布者支持的格式。

JSON:

json
{
  "d" : {
    "value 1" : [ false ],
  },
  "ts" : "2017-04-18T17:36:52.501856"
}

请注意,“ts”(时间戳)应按升序排列。

原始数据:

根据订阅的主题指定地址格式。

例如,如果主题包含以下地址格式:位、16 位无符号、字符串(长度为 4)。地址设置应为:

在此示例中,从值 1 到 3 的顺序应为:位、16 位无符号、字符串。

顺序不能更改,地址元素计数应相同。

项目和应用程序

在上述 MQTT 服务器设置中可以找到两种类型的地址:MQTT_COMMAND(控制地址)和 MQTT_STATUS(状态地址)

控制地址可以指定为设置控制参数的地址,相应的地址包括 MQTT_COMMAND+1 ~ MQTT_COMMAND+43 等。状态地址可以显示连接状态,相应的地址包括 MQTT_STATUS 和 MQTT_STATUS+1。

地址的信息可以在 EasyBuilder Pro 设置对话框中找到。

在 HMI 运行时:

  • 将 MQTT_COMMAND 设置为 1 可以将 HMI 与代理连接。
  • 将 MQTT_COMMAND 设置为 2 可以将 HMI 与代理断开连接。
  • 在更新控制参数后,将 MQTT_COMMAND 设置为 3 可以使用新参数将 HMI 与代理连接。

可以使用上述控制地址在 HMI 运行时动态更改 MQTT 设置。

选择代理

使用 HMI 中的内置代理

要使用 HMI 中的内置代理,请在 MQTT 服务器设置对话框中选择 Localhost 复选框(默认 IP 地址:127.0.0.1),或者在 HMI 上将 IP 地址设置为 127.0.0.1。MQTT 将使用 HMI 中的内置代理,客户端程序可以使用 HMI 的 IP 地址连接到代理。

HMI 的 MQTT 代理应从 EasyBuilder Pro 下载到 HMI。请在下载 MQTT 代理时选择 [运行时]。

使用外部代理

要使用外部代理,请在配置 MQTT 服务器信息时输入外部代理的 IP 地址。

例如,当使用公共代理 HiveMQ 时,代理的数据为:

主机:broker.hivemq.com(212.72.74.21)
端口:1883
Websocket 端口:8000

(http://www.hivemq.com/try-out/)

从 EasyBuilder Pro V5.07.01 开始,支持域名。请在代理的实际 IP 地址或域名(broker.hivemq.com)中输入。

使用自建代理

用户可以托管 MQTT 代理服务器。以下是一些经过验证的选择:

  1. Mosquitto (http://mosquitto.org/download/)
  2. HiveMQ (http://www.hivemq.com/downloads/)(提供测试版本)
  3. EMQ (http://emqtt.io/)

请访问它们各自的官方网站以获取安装和限制的详细信息。

获取 MQTT 数据

获取 MQTT 数据更新需要一个 MQTT 客户端程序。客户端程序连接到代理并注册以接收来自 HMI 的数据更新。在网上可以找到许多免费的客户端程序。本章介绍一个用于 PC 的免费程序:MQTT.fx。

MQTT 客户端程序

在网上可以找到许多免费的 PC 和便携式 MQTT 客户端程序。以下简要介绍如何使用 PC 上的 MQTT.fx 连接到代理以获取来自 HMI 的消息更新的步骤。对于其他程序,配置步骤可能类似。

  1. 假设 HMI 正在运行 MQTT 演示项目。它已配置为连接到 212.72.74.21/端口 1883 的 MQTT 服务器。它有一个名为 Data_Bit 的 MQTT 主题。

  2. 在 MQTT.fx » 编辑连接配置文件窗口中,连接配置文件应设置如下。

    代理地址:212.72.74.21
    代理端口:1883
    配置文件名称:用户定义
    客户端 ID:用户定义

    其余设置可以保持默认值。点击 [连接] 后,将与代理建立连接。

  3. 打开订阅选项卡 » 在下面的字段中输入 Data_Bit » 点击 [订阅] 按钮。成功订阅后,当有 MQTT 消息更新时,它们将被接收并显示在主屏幕上。

参考资料