我认为您必须阅读有关 MQTT 概念的更多信息。
服务质量 (QoS) 级别是消息的发送者和接收者之间关于传递消息的保证的协议。
因此,QoS 用于publish() 和subscribe() 方法而不是connect()。
这是场景:
1.连接:
您必须使用用户名/密码将您的客户端连接到任何代理。每个 mqtt 库都有一个 connect() 方法。在这一步中,您还没有指定 qos。
连接成功后(每个 mqtt 库都有一个 connect 方法的回调),您可以发布或订阅任何所需(或允许)的主题。
示例:
Eclipse Paho library:
IMqttToken token = clientPhone.connect();
HiveMQ Library:
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 library:
IMqttDeliveryToken tokenPub = clientPhone.publish(topicPub, message);
HiveMQ Library:
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.订阅:
一个 SUBSCRIBE 消息可以包含客户端的任意数量的订阅。每个订阅都是一对主题和 QoS 级别。订阅消息中的主题也可以包含通配符,这使得订阅某些主题模式成为可能。如果一个客户端的订阅重叠,则该主题的最高 QoS 级别将胜出,并将由代理用于传递消息。
示例:
Eclipse Paho library:
IMqttToken subToken = MqttAndroidClientInstance.subscribe(topics, qos);
HiveMQ Library:
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- connect with cleanSession false.
B- 订阅 QOS>0。