学习日记-MQTT通信(一)
qqqw151 发布于2018-12 浏览:2921 回复:3
0
收藏

                                                         MQTT通信协议

定位:轻量级,面向物联网的应用。

 

主题订阅
通过主题进行分类的,本质上就是一个UTF-8的字符串,反斜杠代表层级

building-b/floor-5:代表B楼5层的设备。

+/floor-5:代表任何一个楼的5层的设备。

building-b/*:代表B楼所有的设备。

“sensors/temperature/home/kitchen”类似这种主题。

 

服务质量等级MQTT QoS
级别0:尽力而为。消息发送者会想尽办法发送消息,但是遇到意外并不会重试。

级别1:至少一次。消息接收者如果没有知会或者知会本身丢失,消息发送者会再次发送以保证消息接收者至少会收到一次,当然可能造成重复消息。

级别2:恰好一次。保证这种语义肯待会减少并发或者增加延时,不过丢失或者重复消息是不可接受的时候,级别2是最合适的。

级别2所提供的不重不丢很多情况下是最理想的,不过往返多次的确认一定对并发和延迟带来影响。级别1提供的至少一次语义在日志处理这种场景下是完全OK的,所以像Kafka这类的系统利用这一特点减少确认从而大大提高了并发。级别0适合鸡肋数据场景,食之无味弃之可惜,就这么着吧。

 

消息类型
MQTT拥有14种不同的消息类型:

CONNECT:客户端连接到MQTT代理

CONNACK:连接确认

PUBLISH:新发布消息

PUBACK:新发布消息确认,是QoS 1给PUBLISH消息的回复

PUBREC:QoS 2消息流的第一部分,表示消息发布已记录

PUBREL:QoS 2消息流的第二部分,表示消息发布已释放

PUBCOMP:QoS 2消息流的第三部分,表示消息发布完成

SUBSCRIBE:客户端订阅某个主题

SUBACK:对于SUBSCRIBE消息的确认

UNSUBSCRIBE:客户端终止订阅的消息

UNSUBACK:对于UNSUBSCRIBE消息的确认

PINGREQ:心跳

PINGRESP:确认心跳

DISCONNECT:客户端终止连接前优雅地通知MQTT代理

后面我们会给出具体的例子。

 

MQTT代理
市面上有相当多的高质量MQTT代理,其中mosquitto是一个开源的轻量级的C实现,完全兼容了MQTT 3.1和MQTT 3.1.1。下面我们就以mosquitto为例演示一下MQTT的使用。环境是百度开放云的云服务器以及Ubuntu 14.04.1 LTS,简单起见MQTT代理和客户端都安装在同一台云服务器上了。

首先SSH到云服务器,安装mosquitto以及搭配的客户端:apt-get install mosquitto

apt-get install mosquitto-clients

现在在云端模拟云服务,订阅某办公楼5层的温度作为主题:

mosquitto_sub -d -t 'floor-5/temperature'

Received CONNACK

Received SUBACK

Subscribed (mid: 1): 0

然后另外打开一个SSH连接,模拟温度计发送温度消息:

mosquitto_pub -d -t 'floor-5/temperature' -m '15'

Received CONNACK

Sending PUBLISH (d0, q0, r0, m1, 'floor-5/temperature', ... (2 bytes))

此时回到第一个SSH客户端可以看到信息已经接收到了,之后便是心跳消息:

Received PUBLISH (d0, q0, r0, m0, 'floor-5/temperature', ... (2 bytes))

15

Sending PINGREQ

Received PINGRESP

需要注意的是mosquitto客户端默认使用QoS 0,下面我们使用QoS 2订阅这个主题:

mosquitto_sub -d -q 2 -t 'floor-5/temperature'

Received CONNACK

Received SUBACK

Subscribed (mid: 1): 2

切换到另外SSH连接然后在这个主题里面发送温度消息:

mosquitto_pub -d -q 2 -t 'floor-5/temperature' -m '15'

Received CONNACK

Sending PUBLISH (d0, q2, r0, m1, 'floor-5/temperature', ... (2 bytes))

Received PUBREC (Mid: 1)

Sending PUBREL (Mid: 1)

Received PUBCOMP (Mid: 1)

此时回到第一个SSH客户端可以看到信息已经接收到了,以及相应的多次握手消息:

Received PUBLISH (d0, q2, r0, m1, 'floor-5/temperature', ... (2 bytes))

Sending PUBREC (Mid: 1)

Received PUBREL (Mid: 1)

15

Sending PUBCOMP (Mid: 1)

至此我们初步了解了MQTT的基本知识,祝大家在物联网的世界里面玩得开心!

收藏
点赞
0
个赞
共3条回复 最后由用户已被禁言回复于2022-04
#4qqqw151回复于2018-12
#3 不懂即是懂回复
起个引导作用也挺好的

mqtt是我实际用到的一个通信协议,这个协议蛮好的,可以跨网段通信,不需要vpn

0
#3不懂即是懂回复于2018-12

起个引导作用也挺好的

0
#2qqqw151回复于2018-12

对于mqtt这里只做了很简短的介绍

0
TOP
切换版块