我认为您必须阅读有关 MQTT 概念的更多信息。服务质量 (QoS) 级别是消息的发送者和接收者之间关于传递消息的保证的协议。因此,QoS 用于publish()
和subscribe()
方法而不是connect()
.
这是场景:
1. 连接:
您必须使用用户名/密码将您的客户端连接到任何代理。每个 mqtt 库都有一个connect()
方法。在此步骤中,您尚未指定 qos。
成功连接后(每个 mqtt 库都有 connect 方法的回调),您可以发布或订阅任何所需(或允许)的主题。
示例:
Eclipse Paho 库:
IMqttToken token = clientPhone.connect();
HiveMQ 库:
client.connect();
//or
client.connectWith().keepAlive(10).send();
//or
Mqtt5Connect connectMessage = Mqtt5Connect.builder().keepAlive(10).build();
client.connect(connectMessage);
2.发布:
当你想publish()
发消息时,你必须指定一个qos,这样broker就会按照这个qos响应客户端:
Qos=0:
Client ---- Publish method ----> broker
Qos=1:
Client ---- Publish method ----> broker
Client <---- PubAck callback ---- broker
Qos=2:
Client ---- Publish method ----> broker
Client <---- PubRec callback ---- broker
Client ---- PubRel method ----> broker
Client <---- PubComp callback ---- broker
例子:
Eclipse Paho 库:
IMqttDeliveryToken tokenPub = clientPhone.publish(topicPub, message);
HiveMQ 库:
client.publishWith()
.topic("test/topic")
.qos(MqttQos.AT_LEAST_ONCE)
.payload("payload".getBytes())
.send();
//or:
Mqtt5Publish publishMessage = Mqtt5Publish.builder()
.topic("test/topic")
.qos(MqttQos.AT_LEAST_ONCE)
.payload("payload".getBytes())
.build();
client.publish(publishMessage);
3.订阅:
订阅消息可以包含任意数量的客户端订阅。每个订阅都是一对主题和 QoS 级别。订阅消息中的主题也可以包含通配符,这使得订阅某些主题模式成为可能。如果一个客户端有重叠订阅,则该主题的最高 QoS 级别将获胜,并将由代理用于传递消息。
例子:
Eclipse Paho 库:
IMqttToken subToken = MqttAndroidClientInstance.subscribe(topics, qos);
HiveMQ 库:
client.subscribeWith().topicFilter("test/topic").qos(MqttQos.EXACTLY_ONCE).send();
//or:
Mqtt5Subscribe subscribeMessage = Mqtt5Subscribe.builder()
.topicFilter("test/topic")
.qos(MqttQos.EXACTLY_ONCE)
.build();
client.subscribe(subscribeMessage);
编辑(1):
一个mqtt客户端必须使用以下参数,如果想在重新连接后接收已经订阅的主题:
A-连接cleanSession false。
B-订阅QOS>0。