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

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;
import com.tibco.mqtt.test.CustomMQTTCallBack;

public class SubScriberExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 String[] topicFilters ={"topic1","topic2"} ;
         String content = "Message from MqttPublishSample" ;
         int qos = 0;
         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

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

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(对订阅请求消息的应答)。敬请期待和关注.

时间: 2024-08-09 15:12:59

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

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

在上两节,笔者主要介绍了 MQTT,mosquitto,Eclipse Paho的基本概念已经如何安装mosquitto. 在这个章节我们就来看看如何用 Eclipse Paho MQTT工具来发送接收MQTT消息.Eclipse Paho MQTT工具是一个基于Java的Eclipse桌面客户端程序,其底层的和MQTT服务器进行的交互的java类库就是Eclipse Paho java库.假设我们在本机(127.0.0.1)已经启动了一个mosquitto MQTT服务器,其端口为1883.如

[2] MQTT,mosquitto,Eclipse Paho----mosquitto使用扫盲

既然要说后续系统都是围绕MQTT,mosquitto,Eclipse Paho展开,则在这里有必要先给大家简单说一下mosquitto的基本使用,扫一下盲.给大家简单介绍一下mosquitto在window系统下如何安装和启动. (1) 下载安装包 首先登录mosquitto的官方网站(http://mosquitto.org/),到下面的地址(http://mosquitto.org/download/)下载一个安装包,咱们以Window系统为例子.下载mosquitto-1.4.2-inst

[1] MQTT,mosquitto,Eclipse Paho----入门

MQTT,mosquitto,Eclipse Paho这三个单词陌生而又神秘.那么这三个单词究竟是什么意思,代表了什么技术,他们之间有关联吗?不着急,请听笔者慢慢给大家分享. (1)MQTT(英语全称,Message Queue Telemetry Transport),中文翻译过来就是遥测传输协议:其主要提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),属于物联网(Internet of Thing)的一个传输协议.具体协议内容,请参考:http

[6] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNECT消息格式分析

在"[3] MQTT,mosquitto,Eclipse Paho---如何使用 Eclipse Paho MQTT工具来发送订阅MQTT消息?"一文中我已经和大家简单讲述了如何使用Eclipse Paho MQTT.那么当我们点击"Connect"按钮,究竟在TCP协议层发生了什么?如何通过MQTT规定的协议和TCP的二进制数据进行对比,从而更加深入的学习MQTT的消息格式呢?笔者将带领大家以CONNECT消息格式为例子,分析第一个MQTT的消息格式, MQTT的

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

0.前言 在上一节中(MQTT消息格式之SUBSCRIBE(消息订阅)消息分析),客户端发送了订阅的消息,这个时候,服务器端收到订阅主题的MQTT消息之后,肯定需要给一个应答,这个应答信息就是SUBACK(消息订阅应答).消息订阅应答相对来说比较简单. 1.准备步骤 (1) 首先打开WireShark软件,并启动监听 (2) 在Eclipse里面运行下面的代码 [java] view plaincopy import org.eclipse.paho.client.mqttv3.MqttClie

[7] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNACK消息分析

在上节中([6] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNECT消息格式分析)我们分析了CONNECT消息格式,我们知道CONNECT消息是客户端发送出去的,作为对客户端的连接请求,服务器端同样会有一个消息的返回,这个消息就是CONNACK的消息.我们在发出去CONNECT消息后,如果WireShark抓包工具依然开启的话,将会抓到类似于下面的TCP消息,其16进制为:20 02 00 00,那么其代表什么意思呢? 首先我们来看CONNACK的消息格

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

我们知道MQTT是一个物联网协议的一个规范,MQTT的协议最新的两个版本是:3.1.1和3.1.0 (1) 3.1.0的规范如下 http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html (2) 3.1.1的规范如下 http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718029 规范3.1.0和3.1.1还是有

MQTT协议实现Eclipse Paho学习总结

转载自:http://xiaoxinzhou.blog.163.com/blog/static/20704538620145411306821/ 一.概述 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放.简单.轻量.易于实现.这些特点使它适用于受限环境.例如,但不仅限于此: 网络代价昂贵,带宽低.不可靠. 在嵌入设备中运行,处理器和内存资源有限. 该协议的特点有: 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合. 对负载内容屏蔽的消息传输. 使

Paho - MQTT C Cient的实现

来自我的CSDN博客 ??在前几天,我大致了解了一下Paho C项目,并对其的一些内容进行了翻译.俗话说,光说不练假把戏,今天就给大家讲一下使用Paho的客户端库文件实现MQTT C Client的过程. 安装 ??本文是在Linux下安装的,推荐直接进行克隆并安装即可. git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c make sudo make install ??在make完之后,在paho.mqtt.