MQTT协议(一)

一、MQTT简介

MQTT协议(Message Queuing Telemetry Transport)(消息队列遥测传输)是一种基于发布/订阅模式的“轻量级”消息协议,是IBM公司于1999年提出的,由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发。MQTT是一个基于TCP的发布订阅协议,设计的初始目的是为了适用于极有限的内存设备和低带宽的不可靠网络通信,非常适合物联网通信。MQTT 协议目前在 IoT(Internet of things,物联网)、小型设备应用、移动应用等方面有较广泛的应用。

二、协议原理

与HTTP及其请求/响应范例相比,MQTT协议使用发布/订阅体系结构。发布/订阅是事件驱动的,可以将消息推送到客户端。中央通信点是MQTT代理,它负责调度发送者和合法接收者之间的所有消息。向代理发布消息的每个客户端都在消息中包含一个主题。主题是代理的路由信息。每个想要接收消息的客户端都订阅某个主题,并且代理将具有匹配主题的所有消息传递给客户端。

MQTT 协议提供一对多的消息发布,可以解除应用程序耦合,信息冗余小。该协议需要客户端和服务端,而协议中主要有三种身份:发布者(Publisher)、代理(Broker,服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,而消息发布者也可以同时是订阅者,实现了生产者与消费者的解耦。

三、协议格式

协议是通信双方的一个约定,即约定第1位传输什么、第2位传输什么。在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、 可变头(Variable header)、 消息体(payload)三部分构成。

3.1 MQTT 数据包结构

固定头(Fixed header):存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识

可变头(Variable header):存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及具体内容

消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容

3.2 MQTT固定头

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


Bit


7


6


5


4


3


2


1


0


byte 1


MQTT数据包类型


不同类型MQTT数据包的具体标识


byte 2…


剩余长度

3.2.1 MQTT数据包类型

位置:byte 1, bits 7-4。

相于一个4位的无符号值,类型如下:


名称



流方向


描述


Reserved


0


不可用


保留位


CONNECT


1


客户端到服务器


客户端请求连接到服务器


CONNACK


2


服务器到客户端


连接确认


PUBLISH


3


双向


发布消息


PUBACK


4


双向


发布确认


PUBREC


5


双向


发布收到(保证第1部分到达)


PUBREL


6


双赂


发布释放(保证第2部分到达)


PUBCOMP


7


双向


发布完成(保证第3部分到达)


SUBSCRIBE


8


客户端到服务器


客户端请求订阅


SUBACK


9


服务器到客户端


订阅确认


UNSUBSCRIBE


10


客户端到服务器


请求取消订阅


UNSUBACK


11


服务器到客户端


取消订阅确认


PINGREQ


12


客户端到服务器


PING请求


PINGRESP


13


服务器到客户端


PING应答


DISCONNECT


14


客户端到服务器


中断连接


Reserved


15


不可用


保留位

3.2.2 标识位

位置:byte 1, bits 3-0。

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


数据包


标识位


Bit 3


Bit 2


Bit 1


Bit 0


CONNECT


保留位


0


0


0


0


CONNACK


保留位


0


0


0


0


PUBLISH


MQTT 3.1.1使用


DUP1


QoS2


QoS2


RETAIN3


PUBACK


保留位


0


0


0


0


PUBREC


保留位


0


0


0


0


PUBREL


保留位


0


0


0


0


PUBCOMP


保留位


0


0


0


0


SUBSCRIBE


保留位


0


0


0


0


SUBACK


保留位


0


0


0


0


UNSUBSCRIBE


保留位


0


0


0


0


UNSUBACK


保留位


0


0


0


0


PINGREQ


保留位


0


0


0


0


PINGRESP


保留位


0


0


0


0


DISCONNECT


保留位


0


0


0


0

DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。

QoS:发布消息的服务质量,即:保证消息传递的次数

00:最多一次,即:<=1

01:至少一次,即:>=1

10:一次,即:=1

11:预留

RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

3.2.3 剩余长度(Remaining Length)

位置:byte 1。

固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。 例如:计算出后面的大小为0

3.3 MQTT可变头

MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是做为包的标识:


Bit


7


6


5


4


3


2


1


0


byte 1


包标签符(MSB)


byte 2…


包标签符(LSB)

很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

3.4 Payload消息体

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

CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。

SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。

SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。

UNSUBSCRIBE,消息体内容是要订阅的主题。

原文地址:https://www.cnblogs.com/alan6/p/11336826.html

时间: 2024-11-09 09:47:16

MQTT协议(一)的相关文章

物联网MQTT协议分析和开源Mosquitto部署验证

在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定并力推,其具有开放.简单.轻量级以及易于实现的特点使得其即便在资源受限的环境中也能得到很好的使用,比如运行在资源紧缺型的嵌入式系统中或网络带宽非常昂贵的环境中,除此之外,它也被广泛用于遥感勘测.智能家居.能源监测和医疗应用程序等各个领域,是物联网的重要组成部分,将来可能会成为物联网的事实标准. 本篇文章将帮助

MQTT协议简记

 一.定义 MQTT - MQ Telemetry Transport 轻量级的 machine-to-machine 通信协议. publish/subscribe模式. 基于TCP/IP. 支持QoS. 适合于低带宽.不可靠连接.嵌入式设备.CPU内存资源紧张. 是一种比较不错的Android消息推送方案. FacebookMessenger采用了MQTT. MQTT有可能成为物联网的重要协议. MQTT是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接.例

MQTT协议-----订阅

MQTT协议笔记之订阅      http://www.blogjava.net/yongboy/archive/2014/04/12/412351.html MQTT - chszs的专栏    http://blog.csdn.net/chszs/article/category/6262440 MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例    http://blog.csdn.net/shayuye/article/details/17590497

物联网协议测评平台——吊兰使用指南-MQTT协议 Python Paho

在忙了一个周末之后,还是小有成果的.发布了一个简单的物联网平台: http://mqtt.phodal.com,简单地写一下使用指南. CoAP协议 使用Libcoap的话可以用 <code style="box-sizing: border-box; font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; border-top

Mqtt协议IOS端移植1

MQTTClient.h #import <Foundation/Foundation.h> @protocol MQTTDelegate <NSObject> /** * @brief 连接服务器 * * @param [in] N/A * @param [out] N/A * @return void * @note */ - (void) didConnect: (NSUInteger)code; /** * @brief 与服务器断开连接 * * @param [in] N

转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较

一.先看下相关国外的专业数据对四大协议的比较: Protocol                                    CoAP                         XMPP                                                  RESTful HTTP                                                                 MQTT Transport UDP TCP

IBM MQTT协议基本资料

原文链接:http://37iot.com/topic/5565a193d2dd2fc71da04f7c 初次听说MQTT还是在学习Android消息推送的时候,只是粗浅的了解,未曾深究.最近专注于IOT开发,在信息传递方面自然就想到了它. 相关资料: MQ 遥测传输 (MQTT) V3.1 协议规范:http://www.ibm.com/developerworks/cn/webservices/ws-mqtt/index.html 开源的mosquitto项目地址:http://mosqui

MQTT协议学习及实践(Linux服务端,Android客户端的例子)

前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景.本文旨在研究其在消息发布/订阅/接收场景下的应用. MQTT协议中的几个重要概念 服务端 是发送消息的客户端和请求订阅的客户端之间的中介,又称

MQTT协议的使用

MQTT协议的使用: MQTT协议:是发布者,服务器(代理),客户(订阅者).之间通信的协议.客户通过MQTT协议,订阅自己的信息,订阅的内容给服务器.当需要有内容发布的时候,发布者将消息内容发送给服务器,服务器根据订阅了该消息的所有客户,将消息进行推送给所有订阅 该消息的客户(订阅者). MQTT协议在使用上,首先我们要将关于MQTT协议的代码弄到自己的工程中.这里只讲大致的使用过程,不确切的去讲. 首先要创建socket连接,这个和我们和网络通信的时候是一样的,首先都要去socket建立连接

MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制.Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用. 若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]--相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]--在RESTful架构的物联网