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

0.前言

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

1.准备步骤

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

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

[java] view
plain
copy

  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. public class SubScriberExample {
  7. /**
  8. * @param args
  9. */
  10. public static void main(String[] args) {
  11. String topicFilter ="test";
  12. String broker = "tcp://192.168.80.196:1883" ;
  13. String clientId = "paho-1" ;
  14. MemoryPersistence persistence = new MemoryPersistence();
  15. try {
  16. MqttClient sampleClient = new MqttClient(broker, clientId,persistence);
  17. MqttConnectOptions connOpts = new MqttConnectOptions();
  18. connOpts.setCleanSession( false );
  19. System. out .println( "Connecting to broker: " + broker);
  20. sampleClient.connect(connOpts);
  21. System. out .println( "Connected" );
  22. sampleClient.setCallback(new CustomMQTTCallBack());
  23. sampleClient.subscribe(topicFilter,0);
  24. System. out .println( "Subscribe success for: "+topicFilters.toString());
  25. } catch (MqttException me) {
  26. System. out .println( "reason " + me.getReasonCode());
  27. System. out .println( "msg " + me.getMessage());
  28. System. out .println( "loc " + me.getLocalizedMessage());
  29. System. out .println( "cause " + me.getCause());
  30. System. out .println( "excep " + me);
  31. me.printStackTrace();
  32. }
  33. }
  34. }

(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)的相关的消息格式分析,这一部分相对来说比较复杂。敬请期待和关注.

时间: 2024-10-10 19:37:04

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

[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的

[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的消息格

[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软件,并

[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.