2016-09-20 8 views
1

P.S. 결론을 내리기 전에 전체 질문을 읽으십시오.연결이 끊어졌습니다 (32109) - java.io.EOFException (MqttAndroidClient)

나는 connect 메소드가 호출 될 때마다 다음과 같은 예외가 점점 오전 :

연결이 끊어 (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)

나는 몇 가지 코드 스 니펫을 시도했지만 두 가지 모두 동일한 예외를 발생시킵니다. 나는 동일한 서버 URI에서를하려고하면

방법 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(); 
    } 
} 

구독 HiveMQ, 적절한 연결 및 구독으로 완벽하게 작동하며 나에게 결과를 제공합니다.

컴파일 'org.eclipse.paho : org.eclipse.paho.client.mqttv3 : 1.1.0' 컴파일 'org.eclipse.paho : org.eclipse.paho 나는 다음과 같은 두 개의 라이브러리를 사용하고 있습니다 .android.service : 나는 SO 몇 가지 답변을 시도 1.0.2 '

One, Two, Three, FourFive을 좋아하지만, 그들 중 누구도 나를 위해 작동하지 않습니다.

도움이 될 것입니다. 미리 감사드립니다.

답변

3

포트 9001을 사용 중이고 HiveMQ 링크가 웹 소켓 클라이언트를 통한 MQTT를 가리키고 있습니다.

tcp://으로 시작하는 연결 URI를 지정하면 MQTT가 아닌 원시 MQTT와 웹 사이트를 통해 연결해야한다는 신호가 서비스에 전달됩니다.

웹 소켓 지원 구현에 대한 bug 보고서에서 언급했듯이 클라이언트 코드가 웹 소켓을 사용하도록 알리려면 ws://으로 연결 URI를 시작해야합니다.

+0

네가 맞습니다. 나는 ws : //를 시도했지만 웹 소켓 클라이언트를 사용했고 그 경우 거절했다. –

관련 문제