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

是否可以在MQTT主题中仅向用户显示某些消息?,mqtt,Mqtt,我的目标是使用MQTT总线扩展HTTPS REST API平台。我正试图找出最好的办法是怎么做 主题示例: 我有一个HTTPS REST API,它包含以下端点。 1) /files/{fileId} 2) /文件 { "fileName": "Test.txt", "fileId": 123456, "Author": "Bert", "Content": "Hello World" } ------ { "fileName": "Test2.txt",

我的目标是使用MQTT总线扩展HTTPS REST API平台。我正试图找出最好的办法是怎么做

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

2)
/文件

{
    "fileName": "Test.txt",
    "fileId": 123456,
    "Author": "Bert",
    "Content": "Hello World"
}
------
{
    "fileName": "Test2.txt",
    "fileId": 654321,
    "Author": "Hank",
    "Content": "Foo Bar"
}
如果我想基于fileId限制用户,那么主题1很容易做到。如果允许某人查看此文件,他们可以订阅,否则他们不能

现在我的问题是关于第二个话题。是否可以发布到
/文件
,但只向订阅者显示允许他们查看的数据

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

{
    "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)

更新

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

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

如果消息发布到某个主题,则无法指定更多内容(例如用户名或客户端id)

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


您可以通过修改开源代理来实现类似的功能,但我怀疑这是否容易。

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

如果消息发布到某个主题,则无法指定更多内容(例如用户名或客户端id)

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


您可以通过修改开源代理来实现类似的功能,但我怀疑这是否容易。

您的示例看起来非常复杂。也许我们这里有个案子。您似乎希望[ab]使用公共用户机制作为非安全(广播)网络上的点对点机制,例如没有加密的WiFi或没有交换机但没有集线器的以太网

在这种情况下,您可能希望使用端点作为主题(networknode{1,2,…}),以解决单个计算机的问题,如果每个人都看不到答案,则必须对其进行加密。然后你需要一个分配密钥的机制

或者你可能只是想使用普通的HTTPS。MQTT是物联网世界向前迈出的一大步,但它不是万灵药。
另一方面,为什么文件ID不是主题的一部分?

您的示例看起来非常复杂。也许我们这里有个案子。您似乎希望[ab]使用公共用户机制作为非安全(广播)网络上的点对点机制,例如没有加密的WiFi或没有交换机但没有集线器的以太网

在这种情况下,您可能希望使用端点作为主题(networknode{1,2,…}),以解决单个计算机的问题,如果每个人都看不到答案,则必须对其进行加密。然后你需要一个分配密钥的机制

或者你可能只是想使用普通的HTTPS。MQTT是物联网世界向前迈出的一大步,但它不是万灵药。

另一方面,为什么文件ID不是主题的一部分?

除了用户之外,还有其他概念吗?是否存在所有人都具有相同权限的组?设置权限可能取决于您选择的代理,您是否考虑过这样的代理?与其将MQTT路径直接映射到REST路径,不如将其发布到用户/hank/file_changesNo,这是唯一的概念。我想了解的是如何做到最好。例如,用户名/客户端id是否是一个选项?也就是说,我可以向主题和用户名/客户端id发送内容吗?还可以查看更新的问题…请注意,MQTT主题不应该以“/”开头谢谢,更新了问题;-)除了用户之外,还有其他概念吗?是否存在所有人都具有相同权限的组?设置权限可能取决于您选择的代理,您是否考虑过这样的代理?与其将MQTT路径直接映射到REST路径,不如将其发布到用户/hank/file_changesNo,这是唯一的概念。我想了解的是如何做到最好。例如,用户名/客户端id是否是一个选项?也就是说,我可以向主题和用户名/客户端id发送内容吗?还可以查看更新的问题…请注意,MQTT主题不应该以“/”开头谢谢,更新了问题;-)谢谢@hardillb,我正试图将你的答案与本文联系起来:本文将
myhome
作为一个主题。但是我假设多个用户可以订阅
myhome
,但是可以看到不同的内容。不,所有订阅
myhome
的用户都会看到相同的消息。在这种情况下,主题:
{secrect\u access\u token}/myhome
是否是一种有效的设置方法?(和:
{secrect\u access\u token}/myhome/groundfloor
,等等)是的,你可以用这样的方案限制访问啊哈,最后一个问题:-)安全吗?如果我使用SSL?因此,在主题中没有用户名/密码,只有一个令牌?谢谢@hardillb,我正在尝试关联您的答案