簡體   English   中英

連接后,MQTT訂閱客戶端未收到消息

[英]MQTT subscribe client doesn't receive messages after connection

我正在嘗試學習MQTT並一直在使用它。 我已經編寫了一個用於發布的客戶端和一個用於訂閱的客戶端(請參見下文)。

如果我運行訂閱客戶端,然后運行發布客戶端(在訂閱運行時),則一切正常。 我的訂閱客戶端正確接收發布到該主題的消息。

但是,如果我先運行發布客戶端(即,我將消息發布到主題),然后運行訂閱客戶端,則不會收到任何消息。

換句話說,如果我先連接到子客戶端,然后在連接子客戶端時使用pub客戶端發布消息,則一切正常。 但是,如果我先發布一條消息,然后再與子客戶端連接,則不會收到任何消息。 我的理解是,一旦我與客戶建立聯系並訂閱了該主題,就應該收到該主題上出現的消息。

我發現了一個類似的問題: 無法收到mqtt paho上已發布的訂閱主題的郵件 ,盡管這種情況似乎有些不同。 我嘗試更改其他QoS設置或cleanSession標志,但這不能解決問題。

任何幫助,將不勝感激!

發布客戶端:

public class MQTT_Client_Pub implements MqttCallback{

MqttClient client;

public static void main(String[] args) {

    new MQTT_Client_Pub().mqttPub();
}

public void mqttPub(){
    try {
        this.setConnection();

        // Connect
        client.connect();

        // Create new message
        MqttMessage message = new MqttMessage();
        message.setPayload("A single test message from b112358".getBytes());
        message.setQos(0);

        // Publish message to a topic
        System.out.println("Publishing a message.");
        client.publish("pahodemo/test/b112358", message);

        // Disconnect
        client.disconnect();

      } catch (MqttException e) {
        e.printStackTrace();
      } catch (Exception e){
        e.printStackTrace();
      }
}

public void setConnection(){
    // Client
    try{
        client = new MqttClient("tcp://iot.eclipse.org:1883", "mqtt_test_b112358_pub");
    } catch (MqttException e) {
        e.printStackTrace();
    }

    // Connection Options
    MqttConnectOptions options = new MqttConnectOptions();

    // Set the will
    options.setWill("pahodemo/clienterrors", "CRASHED - CONNECTION NOT CLOSED CLEANLY".getBytes(),2,true);

    // Set Callback
    client.setCallback(this);
}

public void deliveryComplete(IMqttDeliveryToken token) {
    System.out.println("Message delivered to the broker.");
}

public void messageArrived(String topic, MqttMessage message) throws Exception {}

public void connectionLost(Throwable cause) {}

}

訂閱客戶:

public class MQTT_Client_Sub implements MqttCallback{

MqttClient client;

public static void main(String[] args) {

    new MQTT_Client_Sub().mqttSub();

}

public void mqttSub(){
    try {
        // Set connection
        this.setConnection();

        // Connect
        client.connect();

        // Subscribe

        client.subscribe("pahodemo/test/b112358", 0);
        // Disconnect
        // client.disconnect();

      } catch (MqttException e) {
        e.printStackTrace();
      }
}

public void setConnection(){
    try {
        // Client
        client = new MqttClient("tcp://iot.eclipse.org:1883", "mqtt_test_b112358_sub");
    } catch (MqttException e) {
        e.printStackTrace();
    }

    // Connection Options
    MqttConnectOptions options = new MqttConnectOptions();
    options.setCleanSession(false);

    // Set the will
    options.setWill("pahodemo/clienterrors", "CRASHED - CONNECTION NOT CLOSED CLEANLY".getBytes(),2,true);

    client.setCallback(this);
}

public void deliveryComplete(IMqttDeliveryToken token) {}

public void messageArrived(String topic, MqttMessage message) throws Exception {
    System.out.println("Message Arrived: " + message.getPayload() + " on tipic: " + topic.getBytes());
}

public void connectionLost(Throwable cause) {}

}

在訂戶連接和訂閱之前發布的消息僅在以下兩種情況下傳遞

  1. 消息發布時為保留狀態。 這意味着有關該主題的最后一條消息將在訂閱時傳遞給新訂閱者。 這只會傳遞最后一條消息。

  2. 如果客戶端先前已連接並訂閱,則將斷開連接。 然后發布一條消息,客戶端再次使用cleansession = false連接。 (並且訂閱為QOS1 / 2時)

這可能會有所幫助: http : //www.thingsprime.com/?p=2897

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM