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