
关于MQTT数据报文系列文章,我们已经介绍了:
MQTT Packet详解【01】:CONNECT & CONNACK
MQTT Packet详解【02】:PUBLISH & PUBACK
MQTT Packet详解【03】:SUBSCRIBE & UNSUBSCRIBE
MQTT Packet详解【04】:PINGREQ & PINGRESP心跳报文
MQTT Packet详解【05】:DISCONNECT断开连接报文
最后一期介绍一个控制报文:AUTH,它是MQTT 5.0为了增强认证功能扩展的。有了它, MQTT 除了支持简单的密码认证和令牌认证之外,还可以支持挑战/响应式的认证方式。为了实现这一点,除了原有的 CONNECT 和 CONNACK 报文之外,还引入了 AUTH 报文来实现任意数量的认证数据交换,以支持各种类型的认证机制,例如 SCRAM、Kerberos 认证等。

下图是一个典型的增强认证报文交互过程:

实际过程就是在CONNECT建立连接时,做一次加强的认证信息。

Sample AUTH Packet
样例 AUTH 包
由于目前没有支持增强认证的 MQTT 客户端,我们将直接展示一个典型的 AUTH 包,该包包括 AUTH 包中最重要的两个属性,即认证方法和认证数据:

接下来,我们将依次介绍这些字段的含义。

AUTH Packet Structure
AUTH 包结构
Fixed Header固定头
在固定头部中,第一个字节的高 4 位中包类型字段的值为 15(0b1111),低 4 位为 0,表示这是一个 AUTH 包。

AUTH 包的可变头部按顺序包含以下字段:


AUTH没有Payload。

Conclusion
结论
AUTH 包是实现各种认证数据交换的核心,并且它还使 MQTT 的增强认证能够支持各种不同的认证机制。像 SCRAM 认证和 Kerberos 认证这样的机制可以提供比简单密码认证更高的安全保护。目前,EMQX 已经支持 SCRAM 认证。
现在,我们已经介绍了 MQTT 的所有控制包类型。作为二进制协议,MQTT 允许我们以任何格式传输应用消息。相应地,我们需要严格按照协议规范编码和解析 MQTT 包,否则可能会导致协议错误。
当我们遇到问题时,可以首先检查对方返回的响应包中的 Reason Code,这可以指示大部分错误原因。当一些嵌入式设备端 SDK 实现较差,无法直接提供 Reason Code 时,我们可以尝试包查看工具来查看包中的 Reason Code。此时,我们可以使用 Wireshark 来避免手动解析。
参考链接: