ActiveMQ Artemis MQTT 3.1 客户端ID严格检查

问题描述 投票:0回答:1

根据标准文档,MQTT 3.1 和 3.1.1 之间允许的客户端 ID 存在差异。

3.1规范更加严格,它要求如果客户端ID超过23个字符,任何代理都必须拒绝连接:

如果客户端 ID 包含超过 23 个字符,服务器将使用 CONNACK 返回码 2 响应 CONNECT 消息:标识符被拒绝。

3.1.1 规范定义了一个字符集,但允许经纪商可以偏离严格的要求:

服务器必须允许长度在 1 到 23 UTF-8 编码字节之间的 ClientId,并且仅包含字符 “0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”[MQTT-3.1.3-5]。

服务器可以允许包含超过 23 个编码字节的 ClientId。服务器可以允许包含未包含在上面给出的列表中的字符的 ClientId。

我正在将 Apache ActiveMQ Artemis 与官方容器映像

broker.xml
配置提供的标准 MQTT 接受器一起使用。

不幸的是,我必须与仅支持 3.1 但超出客户端 ID 长度和允许字符数限制的客户端交换消息。如果 ActiveMQ Artemis 被迫使用 3.1,它将应用严格检查并拒绝连接。

MqttIdentifierRejectedException:无效的 clientIdentifier

是否有一个设置允许将 ActiveMQ Artemis 配置为对客户端 ID 更加宽松?

我在文档中找不到任何内容。不幸的是我无法改变客户的行为。

mqtt activemq-artemis
1个回答
0
投票

ActiveMQ Artemis 确实 允许 MQTT 3.1.1 和 5 个客户端的客户端 ID 长度超过 23 个字符。

但是,正如您所注意到的,MQTT 3.1 规范 不允许客户端 ID 超过 23 个字符。

ActiveMQ Artemis 使用

Netty 的 MQTT 编解码器实现,并且 it 无法解码来自客户端 ID 超过 23 个字符的 3.1 客户端的 CONNECT

 数据包。除了使用不同的编解码器或更改 Netty 的编解码器之外,代理实际上无能为力。也就是说,大多数编解码器可能会像 Netty 一样强制执行该规范,而 Netty 可能会拒绝任何此类更改。

简而言之,规范的存在是有原因的。客户端应该遵循它们,并且当服务器强制执行它们时不应感到惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.