2016-09-20 1132 views
1

P.S.請在結束任何事情之前閱讀整個問題。丟失連接(32109) - java.io.EOFException(MqttAndroidClient)

我得到以下異常時連接方法被稱爲:

連接丟失(32109) - java.io.EOFException的 在org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run (CommsReceiver.java:146) at java.lang.Thread.run(Thread.java:818) 由於:java.io.EOFException at java.io.DataInputStream.readByte(DataInputStream.java:77) at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:65) at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run (CommsReceiver.java:107)

我已經嘗試了幾個代碼片段,但他們都提出了相同的異常。

方法1

private final String serverUri = "tcp://95.177.135.232:9001"; 

private void mqqtConnectAndroidClient() { 
    String clientId = "clientID-" + MqttClient.generateClientId(); 
    mqttAndroidClient = new MqttAndroidClient(getMainActivity(), serverUri, clientId); 
    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); 
    mqttConnectOptions.setKeepAliveInterval(60); 
    mqttConnectOptions.setCleanSession(true); 
    mqttConnectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); 
    try { 
     mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { 
      @Override 
      public void onSuccess(IMqttToken asyncActionToken) { 
       subscribeToTopic(); 
      } 

      @Override 
      public void onFailure(IMqttToken asyncActionToken, Throwable exception) { 
       AppLog.Error("Failed to connect to: " + serverUri); 
       exception.printStackTrace(); 
      } 
     }); 
    } catch (MqttException e) { 
     e.printStackTrace(); 
    } 
} 

方法2

private final String serverUri = "tcp://95.177.135.232:9001"; 

private void methodTwo() { 
    try { 
     MqttDefaultFilePersistence mdfp = new MqttDefaultFilePersistence(MQTT_DIR); 
     mqttClient = new MqttClient(serverUri, "1", mdfp); 
     MqttConnectOptions options = new MqttConnectOptions(); 
     options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); 
     options.setKeepAliveInterval(60); 
     options.setAutomaticReconnect(true); 
     options.setCleanSession(true); 
     mqttClient.connect(options); 
     mqttClient.subscribe("#"); 
     mqttClient.setCallback(new MqttCallback() { 

      @Override 
      public void connectionLost(Throwable arg0) { 
       AppLog.Error("Connection lost"); 
       try { 
        mqttClient.connect(); 
       } catch (MqttException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void deliveryComplete(IMqttDeliveryToken arg0) { 
       AppLog.Error("deliveryComplete"); 
      } 

      @Override 
      public void messageArrived(String arg0, MqttMessage arg1) throws Exception { 
       AppLog.Error("messageArrived"); 
       AppLog.Error(arg1.toString()); 
      } 
     }); 
    } catch (MqttException e) { 
     AppLog.Error("Main Exception"); 
     e.printStackTrace(); 
    } 
} 

訂閱方法

public void subscribeToTopic() { 
    try { 
     String subscriptionTopic = "#"; 
     mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() { 
      @Override 
      public void onSuccess(IMqttToken asyncActionToken) { 
       AppLog.Error("Subscribed!"); 
      } 
      @Override 
      public void onFailure(IMqttToken asyncActionToken, Throwable exception) { 
       AppLog.Error("Failed to subscribe"); 
      } 
     }); 
    } catch (MqttException ex) { 
     System.err.println("Exception whilst subscribing"); 
     ex.printStackTrace(); 
    } 
} 

如果我嘗試在同一臺服務器在URI HiveMQ,通過適當的連接完成正常工作,訂閱也給我結果。我使用了以下兩個庫:

編譯 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' 編譯「org.eclipse.paho:org.eclipse.paho .android.service:1.0.2'

我嘗試了一些SO答案喜歡OneTwoThreeFourFive但他們都不是爲我工作。

任何幫助將不勝感激。先謝謝你!

回答

3

您正在使用端口9001,並且HiveMQ鏈接指向通過Websockets客戶端的MQTT。

您正在指定一個以tcp://開頭的連接URI,它將通知服務它應該通過Websockets與本機MQTT而非MQTT連接。

如實施Websocket支持的bug報告中所述,您需要使用ws://開始連接URI以讓客戶端代碼知道使用Websocket。

+0

是的你是對的。我嘗試過ws://但是使用web socket客戶端,在這種情況下它拒絕了。 –