大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖。超子上一篇文章留了一个问题没说,就是报文标识符的概念。报文标识符在许多的报文中都要用到,按照3.1.1的协议标准要求,它必须是一个非零值,占用2个字节,范围0x0001~0xFFFF。超子给大家总结一下,到底有哪些报文需要用到这2个字节的报文标识符 。
SUBSCRIBE报文:用于订阅一个或多个Topic的报文
SUBACK报文:服务器用于回复SUBSCRIBE订阅Topic报文成功与否的报文
UNSUBSCRIBE报文:取消订阅Topic的报文
UNSUBACK报文:服务器用于回复UNSUBSCRIBE取消订阅Topic报文成功与否的报文
PUBLISH报文:发布和推送数据报文。只有服务质量等级1和2的才需要,等级0的不用报文标识符
PUBACK报文:服务等级1,确认签收数据的报文
PUBREC报文:服务等级2,第1次确认签收数据的报文
PUBREL报文:服务等级2,再次请求确认的报文
PUBCOMP报文:服务等级2,第2次确认签收数据的报文
除了SUBSCRIBE订阅报文以外,其他的报文,超子还没有介绍,不过不用担心,目前我们只要理解报文标识符的作用和意义即可,只有先了解了报文标识符的概念,才能对具体的报文有更好的认识。
理论上,我们可以将报文标识符从1开始,每当发送过一个包含有报文标识符的报文之后,报文标识符加1,直到0xFFFF后,往复循环。这里要特别注意一个问题,就是等级1和2如果没有签收数据,发送一方需要稍作延时后并启动重发,那么重发的时候,报文标识符还要用以前的,不能用新的报文标识符。当然以上的情形不是硬性要求的,假设我就不想变,报文标识符就一直用0x00 0x01,也没有问题,服务器不会认为是错误,而断开连接,下面我举个例子大家就能明白报文标识符的作用了 。
假设我连续发送3个SUBSCRIBE报文,订阅3个Topic,分别是A、B、C,3个报文都用0x00 0x01的报文标识符,假设其中2个成功,1个失败。服务器会回复SUBACK报文,通知我们订阅成功与否,大家现在还没有学习SUBACK报文,不过不影响我们的理解。SUBACK报文的回复顺序和我们发送SUBSCRIBE报文的顺序没有任何关系,这点非常关键,能直接体现出报文标识符的作用。SUBACK报文回复 0x00 0x01成功 0x00 0x01失败 0x00 0x01成功。看到这大家就明白了,因为顺序没有对应关系,而且报文标识符又一样,所以我们根本无法区别出A、B、C这3个Topic哪两个成功,哪一个失败了。
如果我们发送的时候,A的报文标识符是0x00 0x01,B的是0x00 0x02,C的是0x00 0x03,那么SUBACK报文回复0x00 0x02成功 0x00 0x01失败 0x00 0x03成功,如此一来我们就能知道A失败,B和C成功。
好了,对于报标识符,超子就讲到这里,后面还会继续介绍其他的报文,当具体某个报文用到报文标识符的时候,超子会再介绍一下