如何用wireshark分析mqtt协议

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

MQTT是一项消息传递技术,由IBM再2001年发布。
总结一下,机制就是使用一个代理服务器messagebroker,
客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,
同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。
只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,
低带宽,低耗电量,代码量也少,很简单吧。
package compigtestmqtt;
import comibmmqttMqttClient;
import
comibmmqttMqttException;
import comibmmqttMqttSimpleCallback;
public class SubscribeClient {
private final static String
CONNECTION_STRING = "tcp://192168160: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();
mqttClientregisterSimpleHandler(simpleCallbackHandler);//注册接收消息方法
mqttClientconnect(CLIENT_ID+i,
CLEAN_START, KEEP_ALIVE);
mqttClientsubscribe(TOPICS,
QOS_VALUES);//订阅接主题
/

完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息
/
mqttClientpublish(PUBLISH_TOPICS, "keepalive"getBytes(), QOS_VALUES[0],
true);
} catch (MqttException e) {
// TODO Auto-generated
catch block
eprintStackTrace();
}
}
/
简单回调函数,处理client接收到的主题消息
@author pig

/
class SimpleCallbackHandler implements MqttSimpleCallback{
/
当客户机和broker意外断开时触发
可以再此处理重新订阅
/
@Override
public void connectionLost() throws Exception {
//
TODO Auto-generated method
stub
Systemoutprintln("客户机和broker已经断开");
}
/
客户端订阅消息后,该方法负责回调接收处理消息
/
@Override
public void
publishArrived(String topicName, byte[] payload, int Qos, boolean retained)
throws Exception {
// TODO Auto-generated method
stub
Systemoutprintln("订阅主题: " +
topicName);
Systemoutprintln("消息数据: " + new
String(payload));
Systemoutprintln("消息级别(0,1,2): " +
Qos);
Systemoutprintln("是否是实时发送的消息(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 V31版本,已经加入了安全验证机制,不要怕啦。
转载仅供参考,版权属于原作者。祝你愉快,哦

可以的
MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,国内很多企业都广泛使用MQTT作为Android手机客户端与服务器端推送消息的协议

本文将介绍使用 Node-RED 连接到 MQTT 服务器,并对 MQTT 数据进行过滤和处理后再将其发送至 MQTT 服务器的完整 *** 作流程。读者可以快速了解如何使用 Node-RED 对 MQTT 数据进行简单的流处理。

Node-RED 无论是在你本地的电脑上,还是树莓派等设备,亦或是云端服务器,都可以快速安装和使用,下面将使用两种比较常见的安装方式:

使用 npm 进行全局安装:

使用 Docker 进行安装:

如果使用的是 npm 进行的全局安装,那么在提示安装成功后,只需要在全局运行 node-red 命令就可以立即启动 Node-RED。

无论是使用 Docker 还是 npm 在启动成功后,我们只需要打开浏览器,输入当前地址加 1880 端口号,即可打开 Node-RED 的浏览器编辑器页面,例如在本地运行的话,打开浏览器,输入 >

在使用Mqtt的SSL方式连接时遇到了如下问题:

说明使用SSL连接配置中的TrustManager里的server验证失败,即服务端证书签名时用的host和现在签名的host不是同一个。如果是>

MQTT ( 消息队列遥测传输 )是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族 上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个 消息中间件 。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份: 发布者(Publish) 代理(Broker) (服务器) 、订阅者(Subscribe) 。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为: 主题(Topic)和负载(payload) 两部分:

MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:

在MQTT协议中,一个MQTT数据包由: 固定头(Fixed header)、可变头(Variable header)、消息体(payload) 三部分构成。MQTT数据包结构如下:

(1) 固定头(Fixed header) 。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
(2) 可变头(Variable header) 。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
(3) 消息体(Payload) 。存在于部分MQTT数据包中,表示客户端收到的具体内容。

固定头存在于所有MQTT数据包中,其结构如下:

相于一个4位的无符号值,类型、取值及描述如下

在不使用标识位的消息类型中,标识位被作为保留位。如果收到无效的标志时,接收端必须关闭网络连接:

Payload消息体位MQTT数据包的第三部分,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:

MQTT-SN的架构如图1所示。有3种类型的MQTT-SN组件:MQTT-SN客户端、MQTT-SN网关、MQTT-SN转发器。MQTT-SN客户端使用MQTT-SN协议连接到MQTT-SN网关,再连接到MQTT服务端。MQTT-SN网关可以集成到MQTT服务端里。如果是做为独立的网关,则MQTT服务端和MQTT-SN网关间将采用MQTT协议,它的主要功能就是MQTT和MQTT-SN之间的转换。
当客户端所在的网络无法直接连接到网关时,客户端也可以通过转发器来存取网关。转发器将它在无线网络侧所接收到的MQTT-SN侦进行简单封包,然后原封不动地发送给网关;相反的,它将从网关侧接收到的侦解封,然后同样原封不动地发送到客户端。
基于网关在MQTT和MQTT-SN间转发所起的作用,我们可以区分出2种类型的网关:透明网关和集聚网关。

对于每个连接的MQTT-SN客户端,透明网关将会和MQTT服务端建立并维护一个MQTT连接。该MQTT连接将会单独为端到端通信保留,而且对于客户端和服务端间的消息交换是透明的。有多少MQTT-SN客户端连接到网关,在网关和服务端之间就有多少MQTT连接。透明网关在两协议间将扮演语法翻译器的角色。因为MQTT-SN客户端和MQTT服务端间的所有消息交换是端到端的,所以服务端可以向客户端提供其实现的所有功能和特性。
虽然和集聚网关比起来,透明网关的实现比较简单,但是它要求服务端支持为每个活动的客户端保持一个单独的连接。一些MQTT服务端实现可能在能支持的并发连接数上有所限制。

不同于每个连接的客户端都有一个MQTT连接,集聚网关将只有一个到服务端的MQTT连接。MQTT-SN客户端到集聚网关的所有信息交换将只到网关。由网关决定哪些信息将进一步传递到服务端。虽然集聚网关的实现比透明网关更复杂,但它在拥有大量传感器的无线传感网络中是非常有用的,因为它减少了服务端必须并发支持的MQTT连接数。


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

原文地址: https://www.outofmemory.cn/yw/13400379.html

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

发表评论

登录后才能评论

评论列表(0条)

保存