MQTT 协议 部分细节
这里不纪录协议文档中大部分通用内容主要记录一下自己比较困惑的细节处理机制。主要有如下几个点:
连接时的具体细节行为?
client 在连接到broker时同时指定自己的keepaliveTime和 will主题(可选)和对应的具体的msg。之后broker会启动一个定时器,client会按keepaliveTime 的时间间隔给broker发送PINGREQ消息从而告诉broker自己是OK的,然后broker就会回应客户端并复位定时器。如果client超过1.5个keepaliveTime 时间未向broker发送PINGREG,则broker就认为client出问题了就会替client发布连接时预设的will主题消息(如果连接时设置了)以通知感兴趣这个信息的client,所以will主题也叫“遗嘱主题”。client连接到broker的时候可以指定是否清除会话 标志,如果未设置clean session 则broker需要恢复上一次记录的会话包括订阅的主题和will信息。
消息发布过程的retain标志的作用?
告诉服务器是否保存我的这次发布的topic msg 。等再有新的订阅时就直接通知新订阅的client这个topic msg的最近一次msg。
发布和订阅都可以指定QOS等级,那么broker应该如何处理这个问题呢?
以最初主题发布者的QOS等级为基准,比如最初发布者为0则其他订阅者的QOS等级会被降级,也就是说订阅者的QOS等级是在说订阅者接受的最高QOS。所以最后就是如下的组合:
行为发布者,列为订阅者,组合后的结果为订阅者最终的QOS。
QOS |
0 | 1 | 2 |
0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
2 | 0 | 1 | 2 |
所以最后的组合其实就是只有如下几种情况,至少mosquitto是这样实现的。
pub pub(0) pub(1) pub(1) pub(2) pub(2) pub(2)
sub sub(0) sub(0) sub(1) sub(0) sub(1) sub(2)
= 0 0 1 0 1 2