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(): ");
}
};
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
@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
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