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 允许您根据数据源的要求配置这些选项。
当前 OIBus 时间戳
如果 MQTT 载荷不包含时间戳,或者您更愿意使用 OIBus 的当前时间戳,可以配置 OIBus 使用当前的 UTC 时间戳。在这种情况下,OIBus 在处理 MQTT 载荷时会自动生成一个 UTC 时间戳,并且您不需要从载荷中提取它。
载荷中的时间戳
或者,如果 MQTT 载荷包含时间戳,指定时间戳路径以检索它 ,并指定其类型(字符串、ISO8601、UNIX 纪元(秒)或 UNIX 纪元(毫秒))。字符串时间戳可以根据指定的时区 和 时间戳格式来解析。