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

原创 2015年06月16日 12:36:59

0.前言

我们在上几节的协议分析中,发送连接的请求用的是Eclipse Paho MQTT工具,那么笔者这一次改一下,咱们这次用代码来发送Subscribe的MQTT消息,请注意,下面的代码是基于Eclipse Paho Java API之上的代码,在运行下面的代码前,请先去下载Eclipse Paho Java库,其下载地址为:https://www.eclipse.org/paho/clients/java/. 下面我们正式切入正题。

1.准备步骤

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

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

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;


public class SubScriberExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
         String[] topicFilters ={"topic1","topic2"} ;
         String broker = "tcp://192.168.80.196:1883" ;
         String clientId = "paho-1" ;
         MemoryPersistence persistence = new MemoryPersistence();
          try {
                 MqttClient sampleClient = new MqttClient(broker, clientId,persistence);
                 MqttConnectOptions connOpts = new MqttConnectOptions();
                 connOpts.setCleanSession( false );
                 System. out .println( "Connecting to broker: " + broker);
                 sampleClient.connect(connOpts);
                 System. out .println( "Connected" );
                 sampleClient.setCallback(new CustomMQTTCallBack());
                 sampleClient.subscribe(topicFilters,new int[]{1,1});
                 System. out .println( "Subscribe success for: "+topicFilters.toString());
         } catch (MqttException me) {
                 System. out .println( "reason " + me.getReasonCode());
                 System. out .println( "msg " + me.getMessage());
                 System. out .println( "loc " + me.getLocalizedMessage());
                 System. out .println( "cause " + me.getCause());
                 System. out .println( "excep " + me);
                 me.printStackTrace();
         }

	}

}


(3) 运行之后,WireShark将能抓取到下面的TCP的数据包.



2.协议分析

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


2.1  固定头部(Fixed Header)

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

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

Bit

7

6

5

4

3

2

1

0

byte 1

MQTT Control Packet type (8)

Reserved

 

1

0

0

0

0

0

1

0

byte 2

Remaining Length



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

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

82---1000 0010 表示连接的请求是Subscribe

14--1*16+4=20 表示后面将会跟着20个字节


2.2 可变头部(Variable Header)

SUBSCRIBE 可变头部的消息格式见下表

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

 

Description

7

6

5

4

3

2

1

0

Packet Identifier

byte 1

Packet Identifier MSB (0)

0

0

0

0

0

0

0

0

byte 2

Packet Identifier LSB (10)

0

0

0

0

1

0

1

0

 

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

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

00 01 ---表示当前的Package的ID是1


2.3 负载部分(payload)

SUBSCRIBE 负载部分的消息格式见下表,负载部分主要指定订阅的主题(Topic)的名称以及每个订阅的主题对应的QoS级别(总共三种类型的值:0,1,2),需要注意的是,在负载部分,一次可以订阅多个主题。

表3 – SUBSCRIBE 负载部分的消息格式

Description

7

6

5

4

3

2

1

0

Topic Filter

byte 1

Length MSB

byte 2

Length LSB

bytes 3..N

Topic Filter

Requested QoS

 

Reserved

QoS

byte N+1

0

0

0

0

0

0

X

X


从上图的抓包程序得到的数据可知,负载部分实际捕获的数据为:00 06 74 6f 70 69 63 31 01 00 06 74 6f 70 69 63 32 01 因为总共有两个主题:topic1 和topic2,所以我们拿第一个主题(topic1)来分析就行了,后面的Topic类似.

00 06 代表这个topic的长度是6个字节
74 6f 70 69 63 31 代表 topic1

01 代表QoS为1


恭喜你,已经知道了如何分析MQTT SUBSCRIBE的消息格式,是不是觉得很神奇,而且其实分析协议也不难,就这么简单。在下一个章节,笔者将继续分析MQTT的SUBACK(对订阅请求消息的应答)。敬请期待和关注.



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

mqtt协议理解(结合libemqtt,subscribe部分)

1. connect 在libemqtt代码中,客户端的connect代码是调用的mqtt_connect函数,代码如下:int mqtt_connect(mqtt_broker_handle_t* ...

MQTT的学习研究(6)MQTT 订阅消息客户端使用

MQTT的学习研究(六)MQTT 订阅消息客户端使用 参阅官方文档: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.j...
  • shayuye
  • shayuye
  • 2013年12月26日 19:03
  • 2998

MQTT实现消息推送

MQTT实现消息推送   MQTT实现消息接收(接收消息需实现MqttSimpleCallback接口并实现它的publishArrived方法)必须注册接收消息方法 mqttClient....

Meteor中subscribe和publish简单介绍

在使用publish时 需要现在工程目录下运行 meteor remove autopublish, 先看官网上是怎么说的 Each document set is defined by ...

MQTT的学习研究(六) MQTT moquette 的 Blocking API 订阅消息客户端使用

参阅官方文档: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.amqtat.do...

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

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

MQTT 主题与主题过滤

topic
  • amwha
  • amwha
  • 2017年07月05日 14:07
  • 739

Paho MQTT 嵌入式c客户端研究笔记 (二)

paho.mqtt.embedded-c-master\MQTTPacket\samples,这个目录里面封装了发布消息、订阅消息的示例。运行pub0sub1,这个示例里面会去订阅主题消息、发布主题消...

MQTT协议之订阅及发布(使用paho-mqtt-client或mqttv3实现)

另外一个MQTT发布订阅客户端paho-mqtt-client或mqttv3采用回调的方式实现消息的接收,下面看一下实现...

[3] MQTT,mosquitto,Eclipse Paho---如何使用 Eclipse Paho MQTT工具来发送订阅MQTT消息?

在上两节,笔者主要介绍了 MQTT,mosquitto,Eclipse Paho的基本概念已经如何安装mosquitto. 在这个章节我们就来看看如何用 Eclipse Paho MQTT工具来发送接...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[8] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBSCRIBE(消息订阅)消息分析
举报原因:
原因补充:

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