[8] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBSCRIBE(消息订阅)消息分析
2015-06-16 12:36
609 查看
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 |
结合上面的表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 |
结合上面的表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 代表这个topic的长度是6个字节
74 6f 70 69 63 31 代表 topic1
01 代表QoS为1
恭喜你,已经知道了如何分析MQTT SUBSCRIBE的消息格式,是不是觉得很神奇,而且其实分析协议也不难,就这么简单。在下一个章节,笔者将继续分析MQTT的SUBACK(对订阅请求消息的应答)。敬请期待和关注.
相关文章推荐
- java使用POI读取properties文件并写到Excel的方法
- myeclipse不再building workspace个没完没了
- 每天收获一点点------Hadoop Eclipse插件的使用
- Java操作符总结
- Struts2异常或错误不输出到控制台原因及解决办法
- Java 继承详解
- java屏幕截屏
- LeetCode_34---Search for a Range
- 关于 Java 对象序列化您不知道的 5 件事
- Java compiler level does not match解决方法
- MyEclipse 2015 CI
- java中堆和栈的区别
- Java反射教程
- spring事务源码分析结合mybatis源码(三)
- Java使用Fork/Join框架来并行执行任务
- Java 过滤特殊字符
- java正则表达式,将字符串中\后的第一个字母变成大写
- java.net.URLEncoder
- Java垃圾回收机制
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)