mqtt协议介绍
mqtt协议
1 MQTT协议特点
发布和订阅
QoS(Quality of Service levels)
2 MQTT 数据包结构
2.1 MQTT固定头
2.2 MQTT可变头 / Variable header
2.3 Payload消息体
mqtt协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是⼀种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
MQTT最⼤优点在于,⽤极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
作为⼀种低开销、低带宽占⽤的即时通讯协议,使其在物联⽹、⼩型设备、移动应⽤等⽅⾯有较⼴泛的应⽤。
1 MQTT协议特点
MQTT是⼀个基于客户端-服务器的消息发布/订阅传输协议。
MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适⽤范围⾮常⼴泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联⽹(IoT)。
其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及⼀些⼩型化设备中已⼴泛使⽤。
MQTT协议当前版本为,2014年发布的MQTT v3.1.1。除标准版外,还有⼀个简化版MQTT-SN,该协议主要针对嵌⼊式设备,这些设备⼀般⼯作于TCP/IP⽹络,如:ZigBee。
MQTT 与 HTTP ⼀样,MQTT 运⾏在传输控制协议/互联⽹协议 (TCP/IP) 堆栈之上。
MQTT OSI
发布和订阅
MQTT使⽤的发布/订阅消息模式,它提供了⼀对多的消息分发机制,从⽽实现与应⽤程序的解耦。
这是⼀种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),⽽是由MQTT server(或称为 MQTT Broker)分发的。
MQTT 服务器是发布-订阅架构的核⼼。
它可以⾮常简单地在Raspberry Pi或NAS等单板计算机上实现,当然也可以在⼤型机或 Internet 服务器上实现。
服务器分发消息,因此必须是发布者,但绝不是订阅者!
客户端可以发布消息(发送⽅)、订阅消息(接收⽅)或两者兼⽽有之。
客户端(也称为节点)是⼀种智能设备,如微控制器或具有 TCP/IP 堆栈和实现 MQTT 协议的软件的计算机。
消息在允许过滤的主题下发布。主题是分层划分的 UTF-8 字符串。不同的主题级别⽤斜杠/作为分隔符号。
我们来看看下⾯的设置。
光伏发电站是发布者(Publisher)。
主要主题(Topic)级别是"PV",这个⼯⼚发布两个⼦级别"sunshine"和"data";
"PV/sunshine"是⼀个布尔值(true/false,也可以是 1/0),充电站需要它来知道是否应该装载电动汽车(仅在阳光普照时 :))。
充电站(EVSE)是订阅者,订阅"PV/sunshine"从服务器获取信息。
"PV/data" 另⼀⽅⾯,以 kW 为单位传输⼯⼚产⽣的瞬时功率,并且该主题可以例如通过计算机或平板电脑订阅,以⽣成⼀天内传输功率的图表。
这就是⼀个简单的MQTT的应⽤场景,具体如下图所⽰;
MQTT 发布和订阅
QoS(Quality of Service levels)
服务质量是 MQTT 的⼀个重要特性。当我们使⽤ TCP/IP 时,连接已经在⼀定程度上受到保护。但是在⽆线⽹络中,中断和⼲扰很频繁,MQTT 在这⾥帮助避免信息丢失及其服务质量⽔平。这些级别在发布时使⽤。如果客户端发布到 MQTT 服务器,则客户端将是发送者,MQTT 服务器将是接收者。当MQTT服务器向客户端发布消息时,服务器是发送者,客户端是接收者。
QoS  0
这⼀级别会发⽣消息丢失或重复,消息发布依赖于底层TCP/IP⽹络。即:<=1
QoS  1
QoS 1 承诺消息将⾄少传送⼀次给订阅者。
QoS  2
使⽤ QoS 2,我们保证消息仅传送到⽬的地⼀次。为此,带有唯⼀消息 ID 的消息会存储两次,⾸先来⾃发送者,然后是接收者。QoS 级别 2 在⽹络中具有最⾼的开销,因为在发送⽅和接收⽅之间需要两个流。
2 MQTT 数据包结构
固定头(Fixed header),存在于所有MQTT数据包中,表⽰数据包类型及数据包的分组类标识;
可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容;
消息体(Payload),存在于部分MQTT数据包中,表⽰客户端收到的具体内容;
整体MQTT的消息格式如下图所⽰;
开源mqtt服务器
2.1 MQTT固定头
固定头存在于所有MQTT数据包中,其结构如下:
下⾯简单分析⼀下固定头的消息格式;
MQTT消息类型 / message type
**位置:**byte 1, bits 7-4。
4位的⽆符号值,类型如下:
名称值流⽅向描述Reserved0不可⽤保留位
CONNECT1客户端到服务器客户端请求连接到服务器
CONNACK2服务器到客户端连接确认
PUBLISH3双向发布消息
PUBACK4双向发布确认
PUBREC5双向发布收到(保证第1部分到达)
PUBREL6双向发布释放(保证第2部分到达)
PUBCOMP7双向发布完成(保证第3部分到达)SUBSCRIBE8客户端到服务器客户端请求订阅
SUBACK9服务器到客户端订阅确认UNSUBSCRIBE10客户端到服务器请求取消订阅
UNSUBACK11服务器到客户端取消订阅确认

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。