我已经使用MQTT连接所有ESP8266单元,但是我对主题有一个一般性的问题。根据www.hivemq.com的说明:


应避免“前导斜杠” /
应避免空格。
仅使用ASCII字符。
将唯一的标识符或ClientId嵌入到主题中。例如我使用:

Garage_Sensor_001/Temperature/°C value

Livingroom_HID_002/Switch_001/Action value

Bedroom_Sensor_001/Motion_001/Detection value


/> PLACEMENT_OF_NODE/TYPE_OF_SENSOR_UNIT_OR_ACTION/FUNDAMENTAL_UNIT_OF_VALUE_IF_ANY

所以我的问题是:在命名MQTT主题时应该使用特殊字符吗?

#1 楼

Goufalite在这个问题上是完全正确的:根本不是技术问题,而只是命名问题,因此很多建议都是基于作者关于最佳名称的想法而提出的。

MQTT 3.1规范说:



主题名称和主题过滤器区分大小写
主题名称和主题过滤器可以包含空格字符
主题名称和主题过滤器是UTF-8编码的字符串,它们不得编码超过65535个字节。




因此,仅出于技术方面的考虑,纯ASCII和“无空格” '规则是没有必要的;所有合规的MQTT经纪人都应该能够很好地处理它们。

我真的不同意HiveMQ提出的一些观点:


一个空格是每个程序员的天敌,他们常常使阅读和调试主题变得更加困难,而当事情进展不顺利时,他们应该这样做。因此与第一个相似,只是因为允许某些内容并不意味着应该使用它。 UTF-8知道许多不同的空格类型,很明显,应该避免使用这种不常见的字符。


您几乎不可能以其他任何方式使用空格,而不仅仅是按键盘上的SPACE键,所以我不认为意外使用象形文字确实不是问题。


使用非ASCII UTF-8字符确实很难查找与字符集有关的错别字或问题,因为通常它们无法正确显示。除非确实有必要,否则我们建议避免在主题中使用非ASCII字符。


公平点-键入非ASCII字符可能是个大问题。就个人而言,我避免使用Garage_Sensor_001/Temperature/°C只是因为许多键盘没有内置度数符号(英国键盘当然没有!)。这个决定实际上是基于实用性,而不是基于协议。如果您能够使用特殊字符而不必大惊小怪,并且可以确定没有其他人需要输入这些字符,那就去吧!对HiveMQ的一些建议表示怀疑;在您链接的页面上,进一步说,“不订阅#”,该词已在网站上引起争议!

#2 楼

我认为主题命名和变量命名是相同的问题:通用应用程序设计。空格?口音? ...特别是在分割它们时,因此是“无正斜杠”规则。先!

然后放下以下内容,这适用于所有项目:


改进:谁来照顾您的项目?您?一个开源社区?让任何人(甚至您)都不必输入复杂/冗长的主题名称,就变得简单。 br />

#3 楼


仅使用ASCII字符。


用于网络交换的ASCII格式指定ASCII范围从十六进制0扩展到7F,即128个字符。我认为应该支持%,但不支持°。