1 工作原理

image.png

  1. 客户端发布消息到Broker的某个主题
  2. Broker工作是根据主题过滤消息,然后将其分发给订阅者
  3. 其他客户端订阅主题来接收这些消息

2 客户端连接Broker

image.png

<aside> 💡

Mqtt特性

2.1 客户端

所有Client都必须有Client Name或Client Id。同名客户端尝试连接则导致现有客户端连接将被断开。由于大多数 MQTT 客户端会在断开连接后尝试重新连接,这可能会导致断开和连接的循环

MQTT 客户端会定期(通常为 60 秒)发布保持活动消息,告知代理客户端仍处于连接状态。

3 遗嘱消息

当连接异常中断时,发布者会告知代理使用遗嘱消息通知主题的所有订阅者。


 // 创建MQTT客户端
MqttClient mqttClient = new MqttAsyncClient(
    config.getBrokerUrl(),
    config.getClientId(),
    new MemoryPersistence()
);
MqttConnectOptions options = new MqttConnectOptions();
options.setWill(
    config.getWillTopic(),
    config.getWillMessage().getBytes(),
    config.getWillQos(),
    config.isWillRetained()
);
mqttClient.connect(options);

4 清洁会话

/**
 * 订阅某个主题
 * qos 服务质量
 */
public void subscribe(String topic, int qos) {
    try {
        MQTTClient.getClient().subscribe(topic, qos);
    } catch (MqttException e) {
        log.error("订阅异常",e);
    }
}

干净会话是指代理在断开连接时不需要记住有关客户端的任何信息。反之代理将记住客户端订阅,并可能为客户端保留未送达的消息。

取决于订阅主题时所使用的服务质量,

以及发布到主题时所使用的服务质量。