运行模式:
服务器: emqx (https://docs.emqx.io/edge/v3/cn/install.html)
协议头字节数: 2个字节
三种消息可能性保障(Qos):
- Qos0:最多一次 、
- Qos1:最少一次、
- Qos2:只有一次。
Sbuscrib: 订阅消息
publish: 发布消息
MQTT是通过主题对消息进行分类的,可以通过反斜杠表示多个层级关系。主题并不需要创建,直接使用就是了。
主题还可以通过通配符进行过滤。其中,+可以过滤一个层级,而#只能出现在主题最后表示过滤任意级别的层级。
举个例子:
· building-b/floor-5:代表B楼5层的设备。
· +/floor-5:代表任何一个楼的5层的设备。
· building-b/#:代表B楼所有的设备。
Broker(服务器) - 保留消息 功能
MQTT客户端向服务器发布(PUBLISH)消息时,可以设置保留消息(Retained Message)标志。保留消息(Retained Message)会驻留在消息服务器,后来的订阅者订阅主题时仍可以接收该消息。
Broker会存储每个Topic(主题)的最后一条保留消息及其Qos,当订阅该Topic的客户端上线后,Broker需要将该消息投递给它。
保留消息的删除
- 方式1:发送空消息体的保留消息;
- 方式2:发送最新的保留消息覆盖之前的(推荐);
MQTT会话(Clean Session)
MQTT客户端向服务器发起CONNECT连接请求时,可以通过’Clean Session’标志设置会话。
‘Clean Session’设置为0,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销。
‘Clean Session’设置为1,表示创建一个新的临时会话,在客户端断开时,会话自动销毁。
当clean session的值为false,即保留会话,那么
该客户端上线,并订阅了主题"r",那么该主题会一直存在,即使客户端离线,该主题也仍然会记忆在EMQ服务器内存。
当客户端离线又上线时,仍然会接收到离线期间别人发来的publish消息(QoS=0,1,2)。类似即时通讯软件,终端可以接收离线消息。
除非客户端主动取消订阅主题,否则主题一直存在。另外,Mnesia本地不会持久化session,subscription和topic,服务器重启则丢失。