如何用wireshark分析mqtt协议

如何用wireshark分析mqtt协议,第1张

MQTT是一项消息传递技术,由IBM再2001年发布。

总结一下,机制就是使用一个代理服务器messagebroker,

客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,

同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。

只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,

低带宽,低耗电量,代码量也少,很简单吧。

package com.pig.test.mqtt

import com.ibm.mqtt.MqttClient

import

com.ibm.mqtt.MqttException

import com.ibm.mqtt.MqttSimpleCallback

public class SubscribeClient {

private final static String

CONNECTION_STRING = "tcp://192.168.1.60:1883"

private final static boolean

CLEAN_START = true

private final static short KEEP_ALIVE =

30//低耗网络,但是又需要及时获取数据,心跳30s

private final static String CLIENT_ID =

"client1"

private final static String[] TOPICS =

{

"Test/TestTopics/Topic1",

"Test/TestTopics/Topic2",

"Test/TestTopics/Topic3",

"tokudu/client1"

}

private

final static int[] QOS_VALUES = {0, 0, 2,

0}

//////////////////

private MqttClient mqttClient =

null

public SubscribeClient(String i){

try {

mqttClient =

new MqttClient(CONNECTION_STRING)

SimpleCallbackHandler

simpleCallbackHandler = new

SimpleCallbackHandler()

mqttClient.registerSimpleHandler(simpleCallbackHandler)//注册接收消息方法

mqttClient.connect(CLIENT_ID+i,

CLEAN_START, KEEP_ALIVE)

mqttClient.subscribe(TOPICS,

QOS_VALUES)//订阅接主题

/**

*

完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息

*/

mqttClient.publish(PUBLISH_TOPICS, "keepalive".getBytes(), QOS_VALUES[0],

true)

} catch (MqttException e) {

// TODO Auto-generated

catch block

e.printStackTrace()

}

}

/**

* 简单回调函数,处理client接收到的主题消息

* @author pig

*

*/

class SimpleCallbackHandler implements MqttSimpleCallback{

/**

* 当客户机和broker意外断开时触发

* 可以再此处理重新订阅

*/

@Override

public void connectionLost() throws Exception {

//

TODO Auto-generated method

stub

System.out.println("客户机和broker已经断开")

}

/**

* 客户端订阅消息后,该方法负责回调接收处理消息

*/

@Override

public void

publishArrived(String topicName, byte[] payload, int Qos, boolean retained)

throws Exception {

// TODO Auto-generated method

stub

System.out.println("订阅主题: " +

topicName)

System.out.println("消息数据: " + new

String(payload))

System.out.println("消息级别(0,1,2): " +

Qos)

System.out.println("是否是实时发送的消息(false=实时,true=服务器上保留的最后消息): " +

retained)

}

}

/**

* 高级回调

* @author pig

*

*/

class AdvancedCallbackHandler implements MqttSimpleCallback{

@Override

public void connectionLost() throws Exception {

//

TODO Auto-generated method stub

}

@Override

public void publishArrived(String arg0, byte[] arg1, int

arg2,

boolean arg3) throws Exception {

// TODO Auto-generated

method stub

}

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated

method stub

new SubscribeClient("" + i)

}

}

broker服务器,MQTT的jar包,记得下载啊,没有就消息我咯~

到这里,如果完成IBM的MQTT协议实现push消息的实例的,

都会有个问题,好像没考虑到安全问题,如果客户端连上来作乱怎么办呢?

上面用的broker时rsmb的,mqtt的简单服务器。

IBM已经推出了MQTT V3.1版本,已经加入了安全验证机制,不要怕啦。

转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦

MQTT协议是广泛应用的物联网协议,使用测试MQTT协议需要MQTT的代理。有两种方法使用MQTT服务,一是租用现成的MQTT服务器,如阿里云,百度云,华为云等公用的云平台提供的MQTT服务,使用公用的MQTT服务器的好处是省事,但如果仅仅用于测试学习还需要注册帐号,灵活性差些,有的平台还需要付费。另一方法是自己使用开源的MQTT组件来搭建。

MQTT服务器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。

这里介绍的是用轻量级的mosquitto开源项目来搭建一个属于自己的MQTT服务器。

第一步:需要安装一台linux主机,这不多介绍,可以使用真机安装也可以使用虚拟机安装。如果仅仅是自己测试使用都可以。

第二步:下载mosquitto需要的依赖

sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake

第三步:下载mosquitto并解压,现在mosquitto官网最新的版本是1.5.1

tar xzvf mosquitto-1.5.1.tar.gz

第四步:编译

cd mosquitto-1.5.1/

make

make install

第五步:启动mosquitto

./mosquitto -v

1535473957: mosquitto version 1.5.1 starting

1535473957: Using default config.

1535473957: Opening ipv4 listen socket on port 1883.

1535473957: Opening ipv6 listen socket on port 1883.

这时候mosquitto就会以默认的参数启动。如果需要带配置文件可以修改配置文件mosquitto.conf,

启动时候加上参数 -c,

./mosquitto -c mosquitto.conf

可以看到,mosquitto监听的端口为1883.

这时候我们的MQTT服务器就搭建好了。可找一个mqtt客户端来测试一下。

先发布一个主题“home/garden/fountain/2”

内容是“hello world”

这时候在mosquitto会打印出下面的log

535474247: New connection from 192.168.1.105 on port 1883.

1535474247: New client connected from 192.168.1.105 as MQTT_FX_Client (c1, k60).

1535474247: No will message specified.

1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)

1535474307: Received PINGREQ from MQTT_FX_Client

1535474307: Sending PINGRESP to MQTT_FX_Client

1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', ... (12 bytes))

1535474367: Received PINGREQ from MQTT_FX_Client

1535474367: Sending PINGRESP to MQTT_FX_Client

订阅主题“home/garden/fountain/2”

可以看到收到了自己发布的消息。

用wireshark抓包

可以看到抓到了一个MQTT的publish的报文。

如果熟悉lua编程,使用lua扩展就可以了。可以参考wireshark网站上的例子。我们很多私有的协议也是用lua写解析器的。当然,如果你想从头编译wireshark也可以,不过我觉得还是lua扩展相对容易写一些,并且wireshark目录下的chm帮助文件有lua编写的API参考。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11232277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存