MQTT v5 带来了很多新的个性,咱们会尽量以通俗易懂的形式展现这些个性,并探讨这些个性对开发者的影响。到目前为止,咱们曾经探讨过这些 MQTT v5 新个性,明天咱们将持续探讨: 用户属性 。
什么是用户属性
用户属性(User Properties)其实是一种自定义属性,容许用户向 MQTT 音讯增加本人的元数据,传输额定的自定义信息以裁减更多利用场景。
它由一个用户自定义的 UTF-8 的键 / 值对数组组成,并在音讯属性字段中配置,只有不超过最大的音讯大小,能够应用有限数量的用户属性来向 MQTT 音讯增加元数据,并在发布者、MQTT 服务器和订阅者之间传递信息。
如果你相熟 HTTP 协定的话,该性能与 HTTP 的 Header 的概念十分相似。用户属性无效地容许用户扩大 MQTT 协定,并且能够呈现在所有音讯和响应中。因为用户属性是由用户定义的,它们只对该用户的实现有意义。
为什么须要应用用户属性
MQTT 3 的协定扩展性能力较差,用户属性其实就是为了解决这个问题,它反对在音讯中传递任何信息,确保了用户可扩大标准协议的性能。
对于抉择和配置不同的音讯类型,用户属性能够在客户端与 MQTT 服务器之间,或者客户端和客户端之间发送。在连贯客户端中配置用户属性时,只能在 MQTT 服务器上接管,无奈在客户端中接管。如果在发送音讯的时候配置用户属性,则能够在其它客户端中接管。罕用的有以下两种用户属性配置。
连贯客户端的用户属性
当客户端与 MQTT 服务器发动连贯时,服务器能够事后定义好一些须要并且能够应用到的元数据信息,即用户属性,当连贯胜利后,MQTT 服务能够拿到连贯发送过去的相干信息进行应用,因而连贯客户端的用户属性依赖于 MQTT 服务器。
音讯公布的用户属性
音讯公布时的用户属性可能是较为罕用的,因为它们能够在客户端与客户端之间进行元数据信息传递。比方能够在公布时增加一些常见的信息:音讯编号,工夫戳,文件,客户端信息和路由信息等属性。
除上述较为罕用的用户属性设置外,还能够在订阅 Topic 时,勾销订阅时,断开连接时配置用户属性。
用户属性的应用
文件传输
MQTT 5 的用户属性,可扩大为应用其进行文件传输,而不是像之前的 MQTT 3 中将数据放到音讯体的 Payload 中,用户属性应用键值对的形式。这也意味着文件能够放弃为二进制,因为文件的元数据在用户属性中。例如:
{
"filename": "test.txt",
"content": "xxxx"
}
资源解析
当客户端连贯到 MQTT 服务器后,不同的客户端、供应商平台或零碎存在着不同的形式传递音讯数据,音讯数据的格局可能都存在着一些构造差别。还有一些客户端是散布在不同的地区下。比方:地区 A 的设施发送的音讯格局是 JSON 的,地区 B 的设施发送的是 XML 的,此时服务器接管到音讯后可能须要一一进行判断和比照,找到适合的解析器来进行数据解析。
此时为了提高效率和缩小计算负载,咱们能够利用用户属性性能来增加数据格式信息和地区信息,当服务器接管到音讯后,能够应用用户属性中提供的元数据来进行数据解析操作。并且当区域 A 的客户端订阅接管到来自区域 B 的客户端音讯时,也能疾速的分明特定的音讯的来自于哪个区域等,从而使的音讯具备了可追溯性。
{
"region": "A",
"type": "JSON"
}
音讯路由
咱们还能够应用用户属性来做应用层级别的路由。如上所述,存在着不同的零碎和平台,每个区域存在着不同的设施,多个零碎可能收到同一个设施的音讯,有些零碎须要将数据进行实时的展现,另一个零碎可能将这些数据进行时序存储。因而 MQTT 服务器能够通过上报音讯中配置的用户属性来确定将音讯散发到存储音讯的零碎还是展现数据的零碎。
{
"type": "real-time",
"timestamp": 1636620444
}
在客户端中配置用户属性
咱们以 JavaScript 环境为例,应用 MQTT.js 客户端来进行编程。
留神:在连贯客户端时需指定 MQTT 的版本
protocolVersion
为 5。
连贯
咱们在连贯时的 options 中设置 properties 的 User Properties 属性,增加 type 和 region 属性。连贯胜利后,MQTT 服务器将收到这个用户自定义的信息。
// connect options
const OPTIONS = {
clientId: 'mqtt_test',
clean: true,
connectTimeout: 4000,
username: 'emqx',
password: 'public',
reconnectPeriod: 1000,
protocolVersion: 5,
properties: {
userProperties: {
region: 'A',
type: 'JSON',
},
},
}
const client = mqtt.connect('mqtt://broker.emqx.io', OPTIONS)
公布音讯
连贯胜利后公布音讯,公布音讯的配置中设置用户属性,并且监听音讯接管。在 publish 函数中,咱们配置 user properties 属性,并在接管音讯的函数中打印 packet。
client.publish(topic, 'nodejs mqtt test', {
qos: 0,
retain: false,
properties: {
userProperties: {
region: 'A',
type: 'JSON',
},
},
}, (error) => {if (error) {console.error(error)
}
})
client.on('message', (topic, payload, packet) => {console.log('packet:', packet)
console.log('Received Message:', topic, payload.toString())
})
此时咱们看到控制台中曾经打印并输入了方才发送时所配置的用户属性。
对于其它客户端,咱们将在跨平台 MQTT 5.0 桌面客户端工具 – MQTT X 的后续版本中反对用户属性的自定义配置,不便用户疾速测试 MQTT 5.0 的一些新个性,敬请期待!