MQTT系列-遗嘱消息

MQTT系列-遗嘱消息,第1张

客户端断开连接时,发送给相关的订阅者的遗嘱消息。以下情况下会发送 Will Message:

遗嘱消息一般通过在客户端 CONNECT 的时候指定。如下所示,在连接的时候通过调用 MqttConnectOptions 实例的 setWill 方法来设定。任何订阅了下面的主题的客户端都可以收到该遗嘱消息。

在客户端 A 进行连接时候,遗嘱消息设定为”offline“,客户端 B 订阅这个遗嘱主题。当 A 异常断开时,客户端 B 会收到这个”offline“的遗嘱消息,从而知道客户端 A 离线了。

遗嘱消息在客户端正常调用 disconnect 方法之后并不会被发送。

简而言之,就是客户端预先定义好,在自己异常断开的情况下,所留下的最后遗愿(Last Will),也称之为遗嘱(Testament)。这个遗嘱就是一个由客户端预先定义好的主题和对应消息,附加在CONNECT的可变报文头部中,在客户端连接出现异常的情况下,由服务器主动发布此消息。

当Will Flag位为1时,Will QoS和Will Retain才会被读取,此时消息体中要出现Will Topic和Will Message具体内容,否则Will QoS和Will Retain值会被忽略掉。

当Will Flag位为0时,则Will Qos和Will Retain无效。

下面是一个Will Message的示例:

这里介绍一下如何将 Retained 消息与Will 消息结合起来进行使用。

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

1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

2、对负载内容屏蔽的消息传输;

3、使用 TCP/IP 提供网络连接;

4、有三种消息发布服务质量:

“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

“至少一次”,确保消息到达,但消息重复可能会发生。

“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;

首先推荐使用 MQTT-Client-FrameWork ,现在还一直维护,而且有什么问题提issue也有人回答,MQTT-Client-FrameWork 包提供的客户端类有 MQTTSession 和 MQTTSessionManager,建议使用后者维持静态资源,而且已经封装好自动重连等逻辑。初始化时需要传入相关的网络参数。具体如下:

---参数解释---

值为1,服务器需要立刻清理连接状态数据。

(tips:断线重连时 如果为yes,会自动订阅回消息,如果为no,则要手动订阅topic,不然会收不到消息)

双向认证方法:让后台生成 ca.crt 和 client.p12文件(client.p12文件由client.crt和client.key合成) 我使用的是自签证书

1.使用命令行把crt转化为der格式

// 获取服务器返回数据

另外提供一个未封装的session的双向认证方法:

参考:

由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:

MQTT 协议的中心是 MQTT 服务器或代理 (broker) ,支持发布程序和订阅程序进行访问,如下图所示

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

MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串,不过可以通过反斜杠表示多个层级关系。主题并不需要创建,直接使用就是了。

主题还可以通过通配符进行过滤。其中,+可以过滤一个层级,而#只能出现在主题最后表示过滤任意级别的层级。

举个例子:

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

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

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

注意,MQTT允许使用通配符订阅主题,但是并不允许使用通配符广播。

WILL主题也叫遗嘱消息,是一个特殊的主题。

客户端连接Broker的时候,附带一个will主题和will主题对应的内容。

当客户端与Broker断开连接时,Broker将该WILL主题的内容发送给相关的订阅者的遗嘱消息,这样订阅者就知道该客户端已经离线了。

以下情况下会发送 Will Message:

注:在客户端正常调用 disconnect 方法之后并不会被发送。

为了满足不同的场景,MQTT支持三种不同级别的服务质量(Quality of Service,QoS)为不同场景提供消息可靠性:

级别2所提供的不重不丢很多情况下是最理想的,不过往返多次的确认一定对并发和延迟带来影响。

级别1提供的至少一次语义在日志处理这种场景下是完全OK的,所以像Kafka这类的系统利用这一特点减少确认从而大大提高了并发。

级别0适合鸡肋数据场景,基本就没怎么用了。

客户端在连接的时候可以设置clean session,如果设置成true说明在设备离线后broker不保存,设置成false说明在设备离线后broker保存消息,等上线的时候就发送给他。

客户端在连接Broker的时候,会指定心跳的时候。连接成功之后,客户端就按照这个心跳时间定时发送心跳数据给Broker,如果Broker在1.5T时间内没有收到客户端的心跳数据,则判定改设备已经离线,发送WILL主题广播告诉别人该设备已离线。

MQTT可以使用SSL加密方式传输,设备的认证有单向认证和双向认证两种:

MQTT除了有SSL加密之外,对于连接也有账号密码的授权,只要账号密码正确的才可以连接成功。

MQTT 协议和mosquitto: https://shaocheng.li/posts/2015/08/11/

物联网网关协议比较MQTT 和 Modbus:

https://software.intel.com/pt-br/node/628992?language=es


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

原文地址: http://outofmemory.cn/yw/12203954.html

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

发表评论

登录后才能评论

评论列表(0条)

保存