Подтвердить что ты не робот

Синхронный и асинхронный интерфейс объекта MqttClient не работают

Я создал client типа MqttClient и как показано ниже в коде, я создаю клиент и se Asynchronous callback. Проблема в том, что

1 - когда я запускаю программу, появляется System.out.println("Client is Connected");, но я не получаю ответа fr0m onSuccess или от o onFailure, почему? что я делаю неправильно в коде.

2-i реализовал интерфейс static IMqttAsyncClient asynchClientCB = new IMqttAsyncClient(), но поскольку у меня есть клиент типа MqttClient, я не могу использовать этот интерфейс IMqttAsyncClient. Я пытался использовать mqttAsynchClien, но поскольку я программирую для java, а не для Android, я не могу его использовать. Как использовать интерфейс IMqttAsyncClient.?

Update_1

в приведенном ниже коде "Обновлен_код_1", я слегка изменил код, но я ожидаю, что каждый раз, когда я успешно подключу к broker сообщение в синхронном обратном вызове onSuccess для печати, а сообщение в onFailure синхронном callbck для печати в случае прекращения onnection, например, когда я намеренно отключает сеть. Но в ru время, когда я подключаюсь к broker, ни onSuccess, ни onFailur не передает ничего. Итак, для чего они предназначены?

* Update_2_17_Dec_2014

У меня есть запрос, который может привести нас к решению, что имеет значение, если я подключаюсь к брокеру через проводную/проводную сеть? изменит поведение синхронного и асинхронного прослушивателя?

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

Ответ 1

ваш компьютер, на котором находится клиент, который обрабатывает ваш обратный вызов, может иметь исходящий порт, заблокированный брандмауэром машины.