client
türünde MqttClient
türünü oluşturdum ve kodda görüldüğü gibi, bir istemci oluşturup Asynchronous callback
ürününü oluşturuyorum. Sorun,MqttClient nesnesinin Eşitleme ve Eşzamansız arabirimi çalışmıyor
1-ne zaman programm çalıştırın System.out.println("Client is Connected");
görünür, ancak ben onSuccess
fr0m veya onFailure
o herhangi bir yanıt almak, neden? Ben kodda yanlış yapıyorum.
static IMqttAsyncClient asynchClientCB = new IMqttAsyncClient()
arayüzü uygulanan ama tip
MqttClient
bir müşteri beri, bu
IMqttAsyncClient
arayüzünü kullanamazsınız.
mqttAsynchClien
'u kullanmayı denedim ama java için programladığım için
Android
kullanamıyorum.
IMqttAsyncClient
arabirimi nasıl kullanılır. Aşağıdaki kodu "Updated_code_1" in Update_1
i hafifçe kodu değiştirilmiş, ama onSuccess
senkron geri aramasında mesaj basılacak i broker
başarıyla bağlamak her zaman bekliyoruz ve mesaj içinde onFailure
şebekeyi kasıtlı olarak ayırdığım gibi sonlandırılma durumunda sonlandırılacak senkronize çağrı bloğu. Ancak, broker
'a bağlandığımda, ne onSuccess
ne de onFailur
ne olursa olsun, herhangi bir şeyi dağıtır. Peki, onlar ne için tasarlandı?
* Update_2_17_Dec_2014
Ben ben kablolu/Tel-az ağ üzerinden broker bağlanırken ediyorsam, bu önemli mi bir çözelti, bize yol açabilecek bir soruşturma? Bu senkronize ve Eşzamansız dinleyicinin davranışını değiştirir mi?
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 geri arama:
/**
* 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(): ");
}
};
Aboneliği onSuccess() 'dan çıkarırsanız ve bunun yerine bağlantınızın başarılı olup olmadığını kontrol ettikten hemen sonra eklerseniz ne olur? Demek istediğim bu satırı client.subscribe koymak (TOPIC, QoS); isConnected() öğesi true olarak döndükten hemen sonra. Biraz geri çekildiğim için, gerçekten bir geri arama dinleyicisi ayarlamaktan başka bir şey yapmadan veya bağlantınız ile ilgili herhangi bir şey yapmadan önce onSuccess() 'ın çağrılmasını bekleyeceksiniz. – kha
@kha yorum için teşekkür ederim. Aslında yorumlarınızı okuduktan sonra, ne Başarısızlık ve OnFailure ne yaptığını yanlış anladım. çünkü, onSuccess() ve onFailure, bağlantı başarılı "onSuccess" veya başarısız "onFailure" olduğunda çağrılan eşzamanlı geri aramalar olduğunu düşünüyorum, bu yüzden, bağlantı kurulduğunda/başarılı olduktan sonra abone olduklarını düşünerek, onSucess() içinde abone oluyorum. Haklı mıyım yanlış mıyım? Lütfen – rmaik
rehberlik edin. Bağlantınız zaten başarılı ve belirgindi. Bu satırda zaten doğru bir şekilde kontrol ediyorsunuz: if (client.isConnected()) ... Çalışan bir bağlantınız olduğu için konulara abone olmak için iyi olmalısınız.Bir deneyin ve konu aboneliğinin işe yarayıp yaramadığını görün. Eğer öyleyse, o konularda yayınlanan mesajları almaya başlayabilmelisiniz. – kha