我应该在 MQTT 主题中使用特殊字符吗?

物联网 MQTT
2021-06-23 02:06:03

我已经使用 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

IE

PLACEMENT_OF_NODE/TYPE_OF_SENSOR_UNIT_OR_ACTION/FUNDAMENTAL_UNIT_OF_VALUE_IF_ANY

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

3个回答

我认为主题命名与变量命名是同一个问题:常见的应用程序设计。

让我们换一种方式:您的实现编程语言如何管理特殊字符?空间?口音?... 特别是当你拆分它们时,因此“无正斜杠”规则。

如果您对 UTF-8/ASCII 代码页有完美的控制(相信我,你没有),那么继续吧!放口音,特殊字符!

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

  • 进化:谁来负责你的项目?你?一个开源社区?保持简单,让任何人(甚至您)都不必输入复杂/长的主题名称。
  • I18N:让我们面对现实吧,流行的项目都是英文的,嘿,英文没有口音!

Goufalite 关于这个问题是完全正确的:它根本不是技术问题,只是命名问题,所以很多建议都是基于作者关于什么名字最好的想法的非常自以为是。

MQTT 3.1规范说

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

因此,纯粹从技术角度而言,仅 ASCII 和“无空格”规则是不必要的;所有兼容的 MQTT 代理都应该能够很好地处理它们。

无论如何,我并不完全同意 HiveMQ 提出的一些观点:

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

除了按SPACE键盘上键外,您不太可能以任何其他方式使用空格,因此我认为意外使用同形文字不会真正成为问题。

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

公平点 - 输入非 ASCII 字符可能是一个大问题。就个人而言,我会避免Garage_Sensor_001/Temperature/°C仅仅因为很多键盘没有内置度数符号(英国键盘当然没有!)。这个决定实际上是基于实用性而不是协议;如果您能够毫不费力地使用特殊字符,并且您确定没有其他人需要输入这些字符,那就去吧!

另外,我对 HiveMQ 的一些建议有点怀疑;在您链接的页面上,它说“不要订阅#”,这已经在网站上引起了争议

仅使用 ASCII 字符。

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