2014-11-28 13 views
18

Ho creato un client di tipo MqttClient e come illustrato di seguito nel codice, creo un client e il suo Asynchronous callback. Il problema è,L'interfaccia sincrona e asincrona dell'oggetto MqttClient non funziona

1-quando eseguo il programma, viene visualizzato System.out.println("Client is Connected");, ma non ricevo risposta da onSuccess o da o onFailure, perché? cosa sto facendo male nel codice.

2-i ha implementato l'interfaccia static IMqttAsyncClient asynchClientCB = new IMqttAsyncClient(), ma poiché ho un client di tipo MqttClient, non riesco a utilizzare questa interfaccia IMqttAsyncClient. Ho provato a usare mqttAsynchClien ma poiché programmo per java e non per Android non posso usarlo. Come utilizzare l'interfaccia IMqttAsyncClient.?

Update_1

nel seguente codice "Updated_code_1", ho un po 'modificato il codice, ma mi aspetto che ogni volta che mi collego con successo al broker il messaggio in onSuccess richiamata sincrono da stampare, e il messaggio in onFailure callbck sincrono da stampare in caso di onnection terminato come quando disconnetto intenzionalmente la rete. Ma all'ora in cui mi collego allo broker, né lo onSuccess né lo onFailur distribuiscono alcunché. Quindi, per cosa sono progettati?

* Update_2_17_Dec_2014

ho una richiesta che ci potrebbe portare ad una soluzione, che è, cosa importa se Sto collegandomi al broker attraverso la rete/wire-less wired? cambierebbe il comportamento del listener sincrono e asincrono?

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 CallBack:

/** 
* 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

Cosa succede se si estrae l'abbonamento da onSuccess() e invece lo si aggiunge subito dopo aver controllato che la connessione sia andata a buon fine? Quello che intendo è mettere questa linea client.subscribe (TOPIC, QoS); subito dopo aver verificato che isConnected() restituisce true. Sono un po 'confuso perché ti aspetteresti che onSuccess() venga chiamato prima che tu abbia effettivamente sottoscritto o fatto qualcosa con la tua connessione oltre all'impostazione di un listener di callback. – kha

+0

@kha grazie per il commento. In realtà dopo aver letto i tuoi commenti sembra che abbia frainteso cosa fanno onSuccess e onFailure. perché penso che onSuccess() e onFailure siano callback sincroni che vengono chiamati quando la connessione ha esito positivo "onSuccess" o "onFailure" fallito, è per questo che mi iscrivo dentro onSucess(), pensando che quando la connessione è stabilita/riuscita, allora iscriviti. Ho ragione o torto? per favore guida – rmaik

+0

La tua connessione è già andata a buon fine e stabilita. Lo stai già controllando correttamente in questa riga: if (client.isConnected()) ... Poiché hai una connessione funzionante, dovresti essere ok per iscriverti ai tuoi argomenti.Fare un tentativo e vedere se l'abbonamento all'argomento funziona. Se è così, dovresti essere in grado di iniziare a ricevere messaggi pubblicati su questi argomenti. – kha

risposta

2

tua m achine su cui risiede il client, che elabora il callback, potrebbe avere la porta in uscita bloccata dal firewall della macchina.

+0

Non penso, perché posso pubblicare normalmente – rmaik

+0

se il tuo cliente usa quella specifica porta per la pubblicazione in uscita, hai ragione se non sei sicuro, controlla per favore. – aurelius

+0

sì, sono sicuro che sto usando quella porta 1883 – rmaik