是否可以在MQTT主题中仅向用户显示某些消息?

时间:2016-08-10 14:41:37

标签: mqtt

我的目标是使用MQTT总线扩展HTTPS REST API平台。我想弄清楚最好的办法是什么。

主题示例
我有一个HTTPS REST API,其中包含以下端点 1)/files/{fileId}
2)/files

如果我想基于fileId限制用户,主题1很容易。如果允许某人看到这个文件,他们可以订阅,否则他们不能。

现在我的问题是关于第二个主题。是否有可能发布到/files,但只向订阅者显示他们可以看到的数据?

消息示例:
我将这些消息发布到/files

{
    "fileName": "Test.txt",
    "fileId": 123456,
    "Author": "Bert",
    "Content": "Hello World"
}
------
{
    "fileName": "Test2.txt",
    "fileId": 654321,
    "Author": "Hank",
    "Content": "Foo Bar"
}

Bert和Hank都订阅/files,但他们只能看到自己的文件(Bert = 123456,Hank = 654321)。

更新
this artice中,主题以myhome等开头。这可能与上面的示例相同。如果我发布到myhome,当有多个用户时,我怎么知道它只是这个用户。

2 个答案:

答案 0 :(得分:2)

MQTT的ACL方案倾向于纯粹基于用户名和对主题(或通配符主题)的访问。

消息发布到主题,无法再指定任何内容(例如用户名或客户端ID)。

必须进行消息有效负载检查以确定订户是否能够查看特定消息将对性能产生巨大影响。此外,由于没有规定的消息有效载荷格式(您可以发送任何字节数组有效载荷),因此需要指定要过滤的消息部分是困难的。

你可以通过修改开源代理来实现这样的东西,但我怀疑它会很容易。

答案 1 :(得分:0)

您的示例看起来很复杂。也许我们这里有一个XY-problem案例。您似乎想[ab]将公共订户机制用作非安全(广播)网络上的点对点机制,例如不带加密的WiFi或不带交换机但集线器的以太网。

在这种情况下,您可能需要使用端点作为主题(networknode {1、2,...})来寻址单个计算机,并且如果答案不是每个人都看到,则必须对它们进行加密。然后,您需要一种分配密钥的机制。

或者也许您只想使用纯HTTPS。 MQTT对于物联网世界已经迈出了巨大的一步,但这并不是万能的。 另一方面,为什么文件ID不是主题的一部分?