MQTT
MQTT(消息队列遥测传输)是一种为实时消息和数据交换而设计的协议,它使用发布/订阅模型。在 MQTT 中,数据组织在主题中,客户端可以发布或订阅这些主题来交换信息。
MQTT 协议包含两个主要组成部分:
- MQTT Broker:它作为服务器,负责收集和分发数据。它管理主题并促进客户端之间的通信。
- MQTT 客户端:客户端可以通过指定主题向代理发布数据,同时也可以订阅主题以从代理接收数据。
OIBus 作为一个 MQTT 客户端 ,并利用 MQTT.js 库与 MQTT 代理进行交互以数据交换。
特定设置
MQTT 是一种用于数据交换的多功能协议,OIBus 提供多种配置选项以根据您的需求定制其行为。以下是 OIBus 中 MQTT 连接的一些关键配置参数:
- URL:指定 MQTT 代理的地址,通常格式为
mqtt://address:port
。默认的 MQTT 端口是 1883,但可能会根据代理的配置而有所不同。 - 服务质量(QoS):MQTT 提供三个消息传递的 QoS 级别:
- QoS 0:至多一次。消息发送一次,但没有成功接收的保证。
- QoS 1:至少一次。消息被多次发送,直到收件人确认收到。可能出现一些重复。
- QoS 2:正好一次。消息只发送一次,并重试直到收件人确认成功接收。预期不会有重复。
- 持久性:QoS 1 和 QoS 2 允许持久连接。这意味着代理可以在内存中保留一定数量的消息,直到客户端重新连接,确保连接中断时不会丢失数据。
- 认证:
- 无:无需认证。
- 基本:使用用户名和密码进行认证。
- 证书:使用证书进行认证。
- 证书文件路径:用于向代理认证 OIBus 的签名证书文件的路径。
- 密钥文件路径:用来签名证书的密钥文件的路径。
- CA 文件路径:用于生成证书的证书颁发机构文件路径。如果为空,则证书被认为是自签名的。
- 拒绝未经验证的连接:决定是否拒绝无法验证的连接,例如代理的自 签名证书。
- 重连周期:在连接丢失的情况下,尝试重新连接套接字之前的等待时间。
- 连接超时:等待建立连接的最大时间,超过此时间将视为失败。
这些配置选项在 OIBus 中建立 MQTT 连接时提供了灵活性,以适应您的具体要求和安全需求。
项目设置
地址空间和主题
OIBus 中的 MQTT 连接器使用基于订阅的方法,这意味着不需要为这些项目设置扫描模式。相反,您需要指定您希望订阅的主题,MQTT 连接器将检索代理发布到这些主题的数据。
MQTT 中的主题是分层结构化的,按树状结构组织。主题用于在 MQTT 代理的地址空间内定位特定的数据点或信息。
France
| -> Paris
| -> temperatureTank1
| -> temperatureTank2
| -> Chambery
| -> temperatureTank1
| -> temperatureTank2
当您在 MQTT 中订阅数据集时,可以使用通配符指定您感兴趣的主题。以下是一些示例:
- 使用 #(哈希)作为通配符:
- France/# 将订阅 "France" 分支下的所有主题,包括所有子主题及其数据点。
- France/Chambery/# 将订阅 "France/Chambery" 下的所有主题,包括所有特定于 Chambery 的子主题和数据点。
- 使用特定的主题路径:
- France/Paris/temperatureTank1 将只订阅 "France/Paris" 分支中的数据点 "temperatureTank1"。
载荷和时间戳
数据类型
当您订阅一个 MQTT 主题并接收到载荷时,载荷可以包含各种类型的数据,如数字、字符串或 JSON 对象。根据您接收的数据类型,您可能需要解析载荷以提取您想要存储在 OIBus North 缓存中的信息。
以下是解析 MQTT 载荷的一些常见情况:
- 数字:如果载荷包含单个数字值,可以直接将其解析为数字并存储在 North 缓存中。例如,如果您接收到类似
25.5
的载荷,可以将其解析为浮点数并存储为数字数据点。 - 字符串:如果载荷是字符串,可以将其原样存储在 North 缓存中。例如,如果您接收到类似
Hello, MQTT!
的载荷,可以将其存储为字符串数据点。 - JSON:如果载荷是一个 JSON 对象,您需要指定载荷格式以提取相关的数据字段。
JSON 对象
下面是一个必须提取数据的 JSON 载荷格式示例。
{
"pointId": "point1",
"value": "666.666",
"timestamp": "2020-02-02 02:02:02",
"quality": "true"
}
然后必须应用以下配置:
- 载荷为数组:false
- Point ID 来源:payload(它将覆盖项目名称作为参考)
- 时间戳来源:payload
- 数值路径:value
- Point ID 路径:pointId
- 时间戳路径:timestamp
- 类型:String
- 时区:UTC(如果代理在 UTC 时区)
- 时间戳格式:yyyy-MM-dd HH:mm:ss
你可以通过点击最后一节的 +
按钮来检索额外字段。
- 输出中的字段名称:quality
- 检索到的载荷中的路径:quality
JSON 数组
下面是另一个带有数组的示例。
{
"metrics": [
{
"customValue": "666.666",
"customTimestamp": "2020-02-02 02:02:02",
"customQuality": "true"
}
]
}
然后必须应用以下配置:
- 数组中的值:true
- 数组路径:metrics
- Point ID 来源:oibus(将以项目名称作为 Point ID 参考)
- 时间戳来源:payload
- 数值路径:customValue
- 时间戳路径:customTimestamp
- 类型:String
- 时区:UTC(如果代理在 UTC 时区)
- 时间戳格式:yyyy-MM-dd HH:mm:ss
这里,质量字段可以添加:
- 输出中的字段名称:quality
- 检索到的载荷中的路径:customQuality
时间戳
您可以从载荷中提取时间戳,也可以使用 OIBus 提供的当前 UTC 时间戳。这两种方法的选择取决于您的 MQTT 源提供的时间戳方式。OIBus 允许您根据数据源的要求配置这些选项。