查看原文
其他

物联网MQTT—订阅主题

果果 果果小师弟 2022-05-20

点击上方“果果小师弟”,选择“置顶/星标公众号”

干货福利,第一时间送达!

订阅主题指的是客户端向服务端订阅,服务端知道了客户端订阅后会返回一个信号告诉客户端我知道了—这个叫订阅确认。再给举一个例子,比如我的微博是客户端,一个明星的微博是服务端,我关注了这个明星,也就是说我订阅了他,那么这个明星只要在微博上发了一些信息的话,马上就可以推送给我。订阅主题,英文单词Subscribe,之前在讲connect控制报文的时候,connect控制报文是由固定报头,可变报头和有效整合三部分组成。那么基本上咱们在mqtt所有的报文都是由这三部分组成。你可以把它当作一个框架,再强调一下订阅报文是客户端向服务端订阅。那么订阅报文具体有什么作用呢?
如果客户端向服务端发送了订阅请求以后,服务端就会发送publish报文给客户端,subscribe报文指定了最大的QoS等级。跟前面一样,mqtt几乎所有的报文都是由固定报头+可变报头+有效载荷组成。

1.固定报头

2.可变报头

3.有效载荷


订阅主题:
主题: /sys/a10zwkUxQUS/LY-1/thing/service/property/set

相应的16进制:

  • 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74  
    共48个(0x30)
    也就是
    00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74

  • 后面加00(QoS等级)
    00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00

  • 加上固定报头82 ?? 和可变报头00 0A
    82 ?? 00 0A 00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00
    得到??为53(0x35)

  • 最终为:
    82 35 00 0A 00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00

现在我们通过网络调试助手来向阿里云服务端订阅主题
1.第一步向服务端发送connect报文确认是否连接成功,这一步和上一讲的操作相同


2.在连接成功后调试助手会显示服务器发送的连接成功的消息20 02 00 00,然后我们在发送我们刚刚算好的订阅消息报文:

82 35 00 0A 00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 
51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 
69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00

服务端会返回一个90 03 00 0A 10确认订阅。当然如果你发送的订阅消息是错误的话,服务端返回的是90 03 00 0A 80,同时你的网络调试助手马上会断开。这时候你就要回去好好检查一下你的订阅报文是否计算的正确,直到服务器返回正确的回应才可以。

订阅确认

上面我们说在我们发送订阅报文之后服务器会马上返回订阅确认的消息:90 03 00 0A 10,那么为啥服务器返回的的是这几个值而不是其他的值呢?为啥返回了90 03 00 0A 10我们就知道订阅成功了呢?这就需要我们了解一下订阅确认的报文是怎么组成的。
同样,订阅确认的报文也由固定报头、可变报头、有效载荷组成的。

1.固定报头

2.可变报头

3.有效载荷

4.最终得到订阅确认的报文


  知道了订阅确认报文的组成部分现在应该明白了为啥返回的订阅确认消息是90 03 00 0A 10了吧,哈哈。是不是感觉很奇妙!

5.程序设计

/*-------------------------------------*/
/*函数名:SUBSCRIBE订阅topic报文         */
/*参  数:QoS:订阅等级                  */
/*参  数:topic_name:订阅topic报文名称  */
/*返回值:无                            */
/*-------------------------------------*/
void MQTT_Subscribe(char *topic_name, int QoS)
{    
    Fixed_len = 2;                              //SUBSCRIBE报文中,固定报头长度=2  80+??
    Variable_len = 2;                           //SUBSCRIBE报文中,可变报头长度=2  00+0A
    Payload_len = 2 + strlen(topic_name) + 1;   //计算有效负荷长度 = 2字节(topic_name长度)+ topic_name字符串的长度 + 1字节服务等级00
    temp_buff[0]=0x82;                                    //第1个字节 :固定0x82                      
    temp_buff[1]=Variable_len + Payload_len;              //第2个字节 :可变报头+有效负荷的长度 
    temp_buff[2]=0x00;                                    //第3个字节 :报文标识符高字节,固定使用0x00
    temp_buff[3]=0x01;                                    //第4个字节 :报文标识符低字节,固定使用0x01
    temp_buff[4]=strlen(topic_name)/256;                  //第5个字节 :topic_name长度高字节
    temp_buff[5]=strlen(topic_name)%256;                  //第6个字节 :topic_name长度低字节
    memcpy(&temp_buff[6],topic_name,strlen(topic_name));  //第7个字节开始 :复制过来topic_name字串       
    temp_buff[6+strlen(topic_name)]=QoS;                  //最后1个字节:订阅等级
    TxDataBuf_Deal(temp_buff, Fixed_len + Variable_len + Payload_len);  //加入发送数据缓冲区
}

END

如果觉得文章对你有帮助,欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存