mqtt协议

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报文,也需要按照流程来走完。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值