2014-11-28 18 views
18

Ich habe ein client vom Typ MqttClient erstellt und wie in dem unten stehenden Code gezeigt, erstelle ich einen Client und Ich seine Asynchronous callback. Das Problem ist,Synch und asynchrone Schnittstelle von MqttClient Objekt arbeitet nicht

1-wenn ich das Programm laufen, das System.out.println("Client is Connected"); erscheint, aber ich erhalte keine Antwort fr0m die onSuccess oder von o onFailure, warum? Was mache ich falsch im Code?

2-i implementiert die static IMqttAsyncClient asynchClientCB = new IMqttAsyncClient() Schnittstelle, aber da ich einen Client vom Typ MqttClient habe, kann ich diese IMqttAsyncClient Schnittstelle nicht verwenden. Ich habe versucht, mqttAsynchClien zu verwenden, aber weil ich für Java und nicht für Android programmiere, kann ich es nicht benutzen. Wie benutzt man die IMqttAsyncClient Schnittstelle?

update_1

in dem unten stehenden Code "Updated_code_1", i leicht modifiziert den Code, aber ich erwarte jedes Mal, wenn ich die Nachricht erfolgreich in onSuccess synchronen Rückruf an den broker verbinden gedruckt werden, und die Nachricht in onFailure synchrone Callbck wird gedruckt, wenn die Verbindung beendet wird, wenn ich das Netzwerk absichtlich abstoße. Aber bei ru Zeit, wenn ich an die broker anschließen, gibt weder onSuccess noch onFailur irgendeine Sache. Also, wofür sind sie gedacht?

* Update_2_17_Dec_2014

Ich habe eine Anfrage, die uns zu einer Lösung führen könnten, das ist, macht es aus, wenn ich durch Kabel/Draht loses Netzwerk an den Broker anschließe? Würde das das Verhalten des synchronen und des asynchronen Hörers verändern?

Updated_1_code:

MqttConnectOptions opts = getClientOptions(); 
     client = MQTTClientFactory.newClient(broker, port, clientID); 

     if (client != null) { 
      System.out.println("Client is not Null"); 
      client.setCallback(AsynchCallBack); 
      if (opts != null) { 
       iMQTTToken = client.connectWithResult(opts); 
       publishMSG(client, TOPIC,"010101".getBytes(), QoS, pub_isRetained); 
       iMQTTToken.setActionCallback(synchCallBack); 
       if (client.isConnected()) { 
        System.out.println("Client CONNECTED."); 
        publishMSG(client, TOPIC,"010101".getBytes(), QoS, pub_isRetained); 
       } 
      } 
     } 
    .... 
    .... 
    .... 
    .... 
IMqttToken iMQTTToken = new IMqttToken() { 

    @Override 
    public void waitForCompletion(long arg0) throws MqttException { 
     // TODO Auto-generated method stub 
     System.out.println("@waitForCompletion(): waiting " + (arg0 * 1000) + " seconds for connection to be established."); 
    } 

    @Override 
    public void waitForCompletion() throws MqttException { 
     // TODO Auto-generated method stub 
     System.out.println("@waitForCompletion(): waiting for connection to be established."); 
    } 

    @Override 
    public void setUserContext(Object arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void setActionCallback(IMqttActionListener arg0) { 
     // TODO Auto-generated method stub 
     arg0.onSuccess(iMQTTToken); 
     //System.out.println(" " + arg0.onSuccess()); 
     //System.out.println(" " + arg0.onSuccess(iMQTTToken)); 
     iMQTTToken.setActionCallback(synchCallBack); 
    } 

    @Override 
    public boolean isComplete() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Object getUserContext() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public String[] getTopics() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean getSessionPresent() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public MqttWireMessage getResponse() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int getMessageId() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public int[] getGrantedQos() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public MqttException getException() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public IMqttAsyncClient getClient() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public IMqttActionListener getActionCallback() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
}; 

IMqttActionListener synchCallBack = new IMqttActionListener() { 

    @Override 
    public void onSuccess(IMqttToken arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("@onSuccess: Connection Successful."); 
    } 

    @Override 
    public void onFailure(IMqttToken arg0, Throwable arg1) { 
     // TODO Auto-generated method stub 
     System.out.println("@onFailure: Connection Failed."); 
     setViewEnableState(Bconnect, true); 
    } 
}; 

MqttCallback AsynchCallBack = new MqttCallback() { 

    @Override 
    public void messageArrived(String topic, MqttMessage msg) throws Exception { 
     // TODO Auto-generated method stub 
     System.out.println("@messageArrived: Message Delivered."); 
    } 

    @Override 
    public void deliveryComplete(IMqttDeliveryToken token) { 
     // TODO Auto-generated method stub 
     System.out.println("@deliveryComplete: Delivery Completed."); 
    } 

    @Override 
    public void connectionLost(Throwable thrw) { 
     // TODO Auto-generated method stub 
     System.out.println("@Connection Lost: Connection Lost."); 
     setViewEnableState(Bconnect, true); 
    } 
}; 

Newclient:

MqttConnectOptions opts = new MqttConnectOptions(); 
    opts.setCleanSession(CS); 
    opts.setKeepAliveInterval(KATimer); 
    HashMap<Integer, WILL> LWTData = WILLFactory.newWILL("LWT", "LWT MS".getBytes(), 1, false); 
    opts.setWill(LWTData.get(0).getWILLTopic(), 
      LWTData.get(0).getWILLPayLoad(), 
      LWTData.get(0).getWILLQoS(), 
      LWTData.get(0).isWILLRetained()); 

    client = MQTTClientFactory.newClient(IP, PORT, clientID); 

    if (client != null) { 
     System.out.println("client is not null"); 

     client.setCallback(AsynchCB); 
     IMqttToken token = client.connectWithResult(opts); 

     if (client.isConnected()) { 
      System.out.println("Client is Connected"); 

      token.setActionCallback(new IMqttActionListener() { 

       public void onSuccess(IMqttToken arg0) { 
        // TODO Auto-generated method stub 
        System.out.println("synchCB->@onSuccess(): Connection Successful"); 

        try { 
         client.subscribe(TOPIC, QoS); 
        } catch (MqttException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        try { 
         client.disconnect(); 
        } catch (MqttException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

       public void onFailure(IMqttToken arg0, Throwable arg1) { 
        // TODO Auto-generated method stub 
        System.out.println("synchCB->@onFailure(): Connection Failed"); 
       } 
      }); 
     }else { 
      System.out.println("client is not connected"); 
     } 
    }else { 
     System.out.println("client = null"); 
    } 

Asynch Rückruf:

/** 
* Asynchronous Callback to inform the user about events that might happens Asynchronously. If it is not used, any pending 
* messages destined to the client would not be received. 
*/ 
private static MqttCallback AsynchCB = new MqttCallback() { 

    public void messageArrived(String topic, MqttMessage msg) throws Exception { 
     // TODO Auto-generated method stub 
     System.out.println("AsynchCB->@messageArrived(): "); 

     System.out.println("Topic: " + topic); 
     System.out.println("MSG: " + msg.toString()); 

    } 

    public void deliveryComplete(IMqttDeliveryToken arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("AsynchCB->@deliveryComplete(): "); 
    } 

    public void connectionLost(Throwable arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("AsynchCB->@connectionLost(): "); 
    } 
}; 
+0

Was passiert, wenn Sie das Abonnement von onSuccess() herausnehmen und es stattdessen direkt hinzufügen, nachdem Sie überprüft haben, dass Ihre Verbindung erfolgreich ist? Was ich meine ist, diese Zeile clientsubscribe (TOPIC, QoS) zu setzen; direkt nach der Überprüfung, dass isConnected() true zurückgibt. Ich bin ein wenig verwirrt, warum Sie erwarten würden, dass onSuccess() aufgerufen wird, bevor Sie tatsächlich etwas abonniert oder irgendetwas mit Ihrer Verbindung getan haben, abgesehen von der Einstellung eines Callback-Listeners. – kha

+0

@ kha danke für den Kommentar. Nach dem Lesen Ihrer Kommentare scheint es, dass ich missverstanden habe, was onSuccess und onFailure machen. weil ich denke, dass onSuccess() und onFailure synchrone Callbacks sind, die aufgerufen werden, wenn die Verbindung erfolgreich "onSuccess" oder "onFailure" fehlgeschlagen ist, das ist der Grund, warum ich in onSuccess() subscribe, wenn die Verbindung hergestellt/erfolgreich ist. Ich bin richtig oder falsch? bitte führen Sie – rmaik

+0

Ihre Verbindung ist bereits erfolgreich und etabliert. Sie überprüfen es bereits in dieser Zeile: if (client.isConnected()) ... Da Sie eine funktionierende Verbindung haben, sollten Sie Ihre Themen abonnieren.Probieren Sie es aus und sehen Sie nach, ob das Thema Abo funktioniert. In diesem Fall sollten Sie in der Lage sein, Nachrichten zu diesen Themen zu erhalten. – kha

Antwort

2

Ihre m ach, auf dem sich der Client befindet, der Ihren Rückruf bearbeitet, kann der ausgehende Port von der Firewall des Rechners blockiert sein.

+0

Ich glaube nicht, weil ich veröffentlichen kann normalerweise – rmaik

+0

Wenn Ihr Kunde diesen bestimmten Port für ausgehende Veröffentlichungen verwendet, dann haben Sie Recht, wenn Sie nicht sicher sind, überprüfen Sie es bitte. – aurelius

+0

ja bin ich sicher, dass ich diesen Port 1883 benutze – rmaik