您的位置:首页 > 编程语言 > Qt开发

mqtt协议

2017-06-24 16:39 162 查看
mqtt主要有几种报文 :

will遗嘱报文,由connect报文携带,有topic,传递给服务器,由服务器保存,如下情况触发:

1.服务器端检测到连接的io错误或者网络故障。相当于链路故障。

2.客户端某种原因,在keepalive的时间内没有发送报文。相当于远端不可到达,也许程序跑飞了,或者逻辑错误。

3.客户端某种原因,没有发送disconnect报文而直接关闭了网络连接,相当于close了socket。

4.由于mqtt的报文不合规范,触发协议错误而关闭了连接。

用来通知will topic的客户端,我这个客户端出了错误,连接非法中断。

retain保留报文,由publish报文携带,置位retain标志位,由服务器保存。

当一个新的客户端subscribe这个topic的时候,如果有retain的报文,服务器将发送保存的retain报文给新来的客户端。

用来提供给新来的,一些重要的这个topic现在的状态。

普通publish报文,qos分为0,1和2三个等级。

qos == 0的报文,类似于udp,只管发送,不需要远端应答。

qos == 1的报文,需要远端回送puback报文,使得发送端知晓发送端发送的报文已经被接收端接收,

如果发送端没有收到puback报文,可以考虑发送dup报文重发publish报文,每一个qos == 1的报文都有唯一的报文id。

qos == 2的报文,需要远端回送pubrec报文,告知发送端接收端接收到发送端发送报文,然后接收端发送pubrel报文告知接收端

发送端收到了接收端发送的pubrec报文,然后接收端发送pubcomp报文,告知发送端接收端已经收到pubrec报文。四次握手,万无一失。

每一个qos == 2的报文都有唯一的报文id。

这种机制作用在于一种假设,服务器是可靠的,长时间在线的,客户端的连接是不可靠的,不稳定的,时断时续。

非常适用于物联网无线通信工况,比如信号不好,程序有bug,硬件有bug。

其实基于TCP/IP协议的话,还是比较可靠地,只是系统不会明文的告诉上层传输状态,

作为通信,通信的双方在特定的时间窗口之内并不能知道对端的状态,只有接收到对端的报文才能知道,调用write返回,只是把数据拷贝到缓存区,

并 不代表发送成功,socket会不断重发,如果没有收到ack,这个周期默认很长,而且socket默认没有keepalive,这对实时通信和可靠性要求比较高的情况不能容许,

需要在应用层做文章。qos这种机制的存在意义,在于异常断线之后,短时间重新connect保证断线之前的重要报文送达。保存了某种意义上的会话状态机。

publish的qos并不一定受客户端控制的,在subscribe的报文会订阅多个topic,以及申请这个topic的qos最大支持,

返回报文suback中会告知客户端,由服务端审批授权的最大qos。

客户端如果收到了错误topic发送的qos > 0报文,也需要按照流程来走完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: