[9] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBACK(消息订阅应答)消息分析

原创 2015年06月17日 22:51:30

0.前言

在上一节中(MQTT消息格式之SUBSCRIBE(消息订阅)消息分析),客户端发送了订阅的消息,这个时候,服务器端收到订阅主题的MQTT消息之后,肯定需要给一个应答,这个应答信息就是SUBACK(消息订阅应答)。消息订阅应答相对来说比较简单。

1.准备步骤

(1) 首先打开WireShark软件,并启动监听

(2) 在Eclipse里面运行下面的代码

[java] view plaincopy
  1. import org.eclipse.paho.client.mqttv3.MqttClient;  
  2. import org.eclipse.paho.client.mqttv3.MqttConnectOptions;  
  3. import org.eclipse.paho.client.mqttv3.MqttException;  
  4. import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;  
  5. import com.tibco.mqtt.test.CustomMQTTCallBack;  
  6.   
  7. public class SubScriberExample {  
  8.   
  9.     /** 
  10.      * @param args 
  11.      */  
  12.     public static void main(String[] args) {  
  13.          String topicFilter ="test";  
  14.          String broker = "tcp://192.168.80.196:1883" ;  
  15.          String clientId = "paho-1" ;  
  16.          MemoryPersistence persistence = new MemoryPersistence();  
  17.           try {  
  18.                  MqttClient sampleClient = new MqttClient(broker, clientId,persistence);  
  19.                  MqttConnectOptions connOpts = new MqttConnectOptions();  
  20.                  connOpts.setCleanSession( false );  
  21.                  System. out .println( "Connecting to broker: " + broker);  
  22.                  sampleClient.connect(connOpts);  
  23.                  System. out .println( "Connected" );  
  24.                  sampleClient.setCallback(new CustomMQTTCallBack());  
  25.                  sampleClient.subscribe(topicFilter,0);  
  26.                  System. out .println( "Subscribe success for: "+topicFilters.toString());  
  27.          } catch (MqttException me) {  
  28.                  System. out .println( "reason " + me.getReasonCode());  
  29.                  System. out .println( "msg " + me.getMessage());  
  30.                  System. out .println( "loc " + me.getLocalizedMessage());  
  31.                  System. out .println( "cause " + me.getCause());  
  32.                  System. out .println( "excep " + me);  
  33.                  me.printStackTrace();  
  34.          }  
  35.   
  36.     }  
  37.   
  38. }  
(3) 运行之后,WireShark将能抓取到下面的TCP的数据包.


2.协议分析

下面进行具体的协议分析,协议的地址(http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718068)


2.1  固定头部(Fixed Header)

SUBACK固定头部的消息格式见下表

表1 – SUBACK固定头部消息格式

Bit

7

6

5

4

3

2

1

0

byte 1

MQTT Control Packet type (9)

Reserved

 

1

0

0

1

0

0

0

0

byte 2

Remaining Length



从上图的抓包程序得到的数据可知,固定头部的16进制为:90 04

结合上面的表1,我们可知其具体含义如下:

90---1001 0000 表示连接的请求是SUBACK

04--  表示后面将会跟着4个字节

2.2 可变头部(Variable Header)

SUBSCRIBE 可变头部的消息格式见下表,其表示的是消息的ID,分高位和低位。

表2 - 可变头部的消息格式

Bit

7

6

5

4

3

2

1

0

byte 1

Packet Identifier MSB

byte 2

Packet Identifier LSB



从上图的抓包程序得到的数据可知,可变头部的16进制为:00 01

结合上面的表2,我们可知其具体含义如下:

00 01 ---表示当前的SUBACK的消息ID是1,这个和上节中的SUBSCRIBE(消息订阅)的消息ID的值必须保持一致。


2.3 负载部分(payload)

SUBACK负载部分的消息格式见下表,负载部分主要返回订阅的结果。其返回的值下面4中类型,其他的都是没有意义的。

允许返回的值

0x00 - 表示成功- 最大的QoS 0 
0x01 - 表示成功- 最大的 QoS 1 
0x02 - 表示成功- 最大的 QoS 2 
0x80 - 表示订阅失败。 

表3 - 负载部分的消息格式

Bit

7

6

5

4

3

2

1

0

 

Return Code

byte 1

X

0

0

0

0

0

X

X



从上图的抓包程序得到的数据可知,负载部分实际捕获的数据为:00 00 

其表示消息订阅成功,且以后收到得到订阅的消息的QoS的值只能够为0.


恭喜你,已经知道了如何分析MQTT SUBACK的消息格式,这个协议相对来说比较简单。在下一节我们将分析和消息发布(Publication)的相关的消息格式分析,这一部分相对来说比较复杂。敬请期待和关注.


版权声明:本文为博主原创文章,未经博主允许不得转载。

MQTT-新一代物联网协议

MQTT - MQ Telemetry Transport   轻量级的 machine-to-machine 通信协议。 publish/subscribe模式。 基于TCP/IP。 支持Q...
  • huayucong
  • huayucong
  • 2016年07月28日 16:10
  • 4706

MQTT协议详解,非常易懂

MQTT协议详解一 协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html...
  • y281252548
  • y281252548
  • 2016年02月18日 11:37
  • 33902

MQTT学习了解------阿冬专栏

源文档:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html MQTT V3.1 Protocol S...
  • zhangdong305
  • zhangdong305
  • 2016年06月22日 10:25
  • 3152

MQTT基础——Part 2. 发布/订阅模式

MQTT基础——Part 2. 发布/订阅模式作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs本文是《MQTT基础》系列博...
  • chszs
  • chszs
  • 2016年06月21日 18:25
  • 9537

基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(七)交叉编译paho.mqtt.embedded-c库和嵌入式linux样例程序

本篇将把paho.mqtt.embedded-c官方的源代码交叉编译成数据包封装库和应用程序两部分,并把样例应用程序在mini2440上运行。...
  • sqshining
  • sqshining
  • 2017年04月16日 03:43
  • 2140

[9] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBACK(消息订阅应答)消息分析

在上一节中(MQTT消息格式之SUBSCRIBE(消息订阅)消息分析),客户端发送了订阅的消息,这个时候,服务器端收到订阅主题的MQTT消息之后,肯定需要给一个应答,这个应答信息就是SUBACK(消息...
  • chancein007
  • chancein007
  • 2015年06月17日 22:51
  • 2807

MQTT协议详解二

转载地址:http://www.xuebuyuan.com/1951013.html 下面我们开始一步步执行连接,订阅,发布和接收。 首先就是CONNECT,发送连接申请。 ...
  • l_215851356
  • l_215851356
  • 2016年12月25日 14:26
  • 660

[8] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBSCRIBE(消息订阅)消息分析

我们在上几节的协议分析中,发送连接的请求用的是Eclipse Paho MQTT工具,那么笔者这一次改一下,咱们这次用代码来发送Subscribe的MQTT消息,请注意,下面的代码是基于Eclipse...
  • chancein007
  • chancein007
  • 2015年06月16日 12:36
  • 6500

[4] MQTT,mosquitto,Eclipse Paho---MQTT消息格式分析概述

我们知道MQTT是一个物联网协议的一个规范,MQTT的协议最新的两个版本是:3.1.1和3.1.0 (1) 3.1.0的规范如下 http://public.dhe.ibm.com/software/...
  • chancein007
  • chancein007
  • 2015年06月12日 12:51
  • 3653

mqtt协议以及其妙用

mqtt是轻量级基于代理的发布/订阅的消息传输协议。 作为安卓开发而言,我们一般将其用来作为推送协议或者将其作为与嵌入式通信的协议。 MQTT(Message Queuing Telemetry T...
  • g951dd
  • g951dd
  • 2016年08月18日 08:22
  • 182
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[9] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBACK(消息订阅应答)消息分析
举报原因:
原因补充:

(最多只允许输入30个字)