2014-11-28 35 views
18

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.

2-i 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(): "); 
    } 
}; 
+0

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

+0

@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

+0

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

cevap

2

senin m Geri bildiriminizi işleyen istemcide bulunan akine, makinenin güvenlik duvarı tarafından engellenen giden bağlantı noktasına sahip olabilir.

+0

Bunu düşünmüyorum çünkü yayınlayabilirim normalde – rmaik

+0

eğer istemciniz giden yayın için o belirli portu kullanıyorsa, emin değilseniz, kontrol edin, lütfen kontrol edin. – aurelius

+0

evet eminim ki 1883 numaralı bağlantı noktasını kullanıyorum – rmaik