MQTT (Professional)

概述

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的发布-订阅消息协议,专为 IoT 和 IIoT 通信设计。它是工业 4.0 中最重要的通信标准之一,实现了车间设备、云平台和企业系统之间的实时数据交换。

realvirtual 中的 MQTT 接口提供了与 MQTT 代理的无缝集成,用于云连接和分布式自动化系统。它支持 MQTT 3.1.1 和 MQTT 5.0 协议,并提供 WebSocket 传输、TLS 加密和自动重连处理选项。

主要特性

  • 支持 MQTT 3.1.1 和 MQTT 5.0 协议
  • TCP 和 WebSocket 传输选项
  • TLS/SSL 加密安全通信
  • 用户名/密码身份验证
  • 自动信号发现和导入
  • 层级化主题组织
  • 批量消息发布以优化性能
  • 后台线程通信以获得最佳 Unity 性能
  • 支持 MQTT 通配符的主题过滤
  • 实时双向通信

兼容的 MQTT 代理

该接口适用于所有标准 MQTT 代理,包括:

  • Mosquitto - 流行的开源代理 (mosquitto.org)
  • HiveMQ - 企业级云代理 (hivemq.com)
  • AWS IoT Core - Amazon 托管的 IoT 服务
  • Azure IoT Hub - Microsoft 云 IoT 平台
  • 本地代理 - 用于本地部署

添加 MQTT 接口

通过选择 Tools > realvirtual > Add Object > Interface > MQTT 将 MQTT 接口添加到 realvirtual 场景。

MQTT 接口 Inspector

MQTT 接口通过 Unity Inspector 提供全面的配置选项,包括连接设置、安全选项、信号管理和实时监控。

属性

连接设置

Broker(字符串)- MQTT 代理地址。可以是主机名(例如 test.mosquitto.org)、IP 地址(例如 192.168.1.100)或 localhost(用于本地代理)。

Port(整数)- MQTT 通信端口。默认为 1883,用于未加密的 TCP 连接。常见端口配置:

  • 1883:标准 MQTT over TCP
  • 8883:MQTT over TLS/SSL
  • 8080/8083:MQTT over WebSocket(因代理而异)

Websocket(布尔值)- 启用后,使用 WebSocket 传输代替 TCP。这是 WebGL 构建所必需的,也适用于绕过阻止标准 MQTT 端口的防火墙限制。

MQTT5(布尔值)- 启用 MQTT 5.0 协议功能。禁用时使用 MQTT 3.1.1,与较旧的代理具有更广泛的兼容性。

Send Cycle Ms(整数)- 信号更新的批量持续时间(毫秒)。设置为 0 时,更改会立即发送。大于 0 的值将多个信号更新批量发送以提高性能,在许多信号快速变化时减少网络开销。

安全设置

Security(布尔值)- 安全功能的主开关。启用后,允许配置身份验证凭据和 TLS 加密。

UserName(字符串)- MQTT 代理身份验证的用户名。匿名连接时留空。仅在 Security 启用时可见。

Password(字符串)- 经过身份验证的连接的密码。仅在 Security 启用时可见。

TLS(布尔值)- 启用 TLS/SSL 加密以进行安全通信。该接口接受开发环境中的自签名证书。仅在 Security 启用时可见。

Delete Last Session Packets(布尔值)- 控制清除会话行为。启用后,以全新会话开始,丢弃之前连接中排队的消息。禁用时,保留并交付上次会话中未确认的消息。

信号导入设置

Use Topic Filters(布尔值)- 启用后,使用 MQTT 通配符模式进行选择性主题导入。禁用时,从代理导入所有可用主题。

Import Topic Filters(列表)- 用于选择性信号导入的 MQTT 通配符模式。支持标准 MQTT 通配符:

  • + 匹配单个层级(例如 sensor/+/temperature
  • # 匹配多个层级(例如 factory/line1/#)仅在 Use Topic Filters 启用时可见。

Import As Hierarchy(布尔值)- 启用后,创建与 MQTT 主题结构匹配的 GameObject 层级。类似 factory/line1/sensor/temp 的主题创建嵌套的 GameObject。禁用时,创建以斜杠替换为下划线的扁平结构。

Max Import Topics(整数)- 限制导入的主题数量,防止大型代理部署使接口过载。设置为 0 表示无限制导入。

运行时状态

State(只读)- 当前连接状态,显示为"Connected"(绿色)或"Disconnected"(红色)。

Input Signals(只读)- PLCInput 信号数量(发布到 MQTT)。

Output Signals(只读)- PLCOutput 信号数量(从 MQTT 订阅)。

Comm Cycle Ms(只读)- 当前通信周期时间(毫秒)。

Cycle Count(只读)- 自连接以来完成的通信周期数。

配置操作

Update Cycle Ms(整数)- 后台线程的目标通信周期时间。

Only Transmit Changed Inputs(布尔值)- 启用后,仅发布自上一个周期以来已更改的信号,减少网络流量。

Auto Reconnect(布尔值)- 连接丢失时自动尝试重连。

Reconnect Interval Seconds(整数)- 重连尝试之间的等待时间。

Max Reconnect Attempts(整数)- 放弃前的最大重连尝试次数(0 = 无限)。

Debug Mode(布尔值)- 启用详细日志记录,用于排查连接和通信问题。

信号管理

自动信号导入

MQTT 接口提供强大的信号发现和导入功能:

  1. 在 Inspector 中点击 Import Signals 按钮
  2. 接口连接到代理并根据您的过滤配置订阅主题
  3. 为发现的主题自动创建信号,具有适当的数据类型(Bool、Int、Float 或 Text)
  4. 主题映射到 GameObject 名称,特殊字符被清理

主题过滤

在 Import Topic Filters 中使用 MQTT 通配符模式来选择性导入信号:


sensor/+/temperature    # 所有温度传感器
machine/press/#         # machine/press 下的所有内容
+/+/status             # 第三层的所有状态主题
production/line*/+     # 无效 - 通配符必须是 + 或 #

手动信号配置

也可以手动创建信号:

  1. 在 MQTT 接口下添加子 GameObject
  2. 添加 PLCInput(发布)或 PLCOutput(订阅)组件
  3. 将信号的 Name 属性设置为 MQTT 主题
  4. 如果 Name 为空,则使用 GameObject 名称作为主题

层级化组织

Import As Hierarchy 启用时,主题结构 factory/line1/plc/status 创建:


MQTT Interface
└── factory
    └── line1
        └── plc
            └── status (带有 Signal 组件)

这种组织方式有助于在复杂的自动化系统中管理大量信号。

使用示例

基本连接


// 以编程方式配置 MQTT 接口
var mqtt = GetComponent<MQTTInterface>();
mqtt.Broker = "test.mosquitto.org";
mqtt.Port = 1883;
mqtt.OpenInterface();

安全云连接

对于需要身份验证的云代理:

  1. 启用 Security
  2. UserNamePassword 中输入代理凭据
  3. 启用 TLS 进行加密通信
  4. 设置适当的端口(TLS 通常为 8883)

WebGL 构建的 WebSocket

对于 Unity WebGL 构建或受防火墙限制的环境:

  1. 启用 Websocket
  2. 使用 WebSocket 端口(通常为 8080 或 8083)
  3. 确保代理支持 WebSocket 连接

性能优化

对于高频信号更新:

  1. 设置 Send Cycle Ms 以批量更新(例如 100ms)
  2. 启用 Only Transmit Changed Inputs
  3. 使用主题过滤器限制订阅

另请参见