MQTT на Android: соединение потеряно

#android #mqtt

#Android #mqtt

Вопрос:

Я пытаюсь использовать клиент MQTT в приложении Android, но не могу заставить его работать.
Мой клиент MQTT — 0.4.0, а мой Android — 4.0.3.

Приложение очень простое: в нем есть EditText и кнопка для публикации текста. Кроме того, у него есть TextView для отображения полученного сообщения.

Каждый раз, когда нажимается кнопка «Опубликовать», отображается сообщение «соединение потеряно», иногда два или три раза, поскольку оно несколько раз пыталось подключиться, а затем отключалось.
Кроме того, без нажатия на кнопку, если я попытаюсь опубликовать сообщение в теме «123456789» через другой клиент, ничего не произойдет (сообщение «сообщение получено» не отображается).

Я устанавливаю права доступа к ИНТЕРНЕТУ и WRITE_EXTERNAL_STORAGE, и приложение не закрывается с исключением, просто сообщения не отправляются / не принимаются.

Это основная активность

 package com.example.mqtttest;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
    private static final String MQTT_DIR = "/mnt/sdcard";
    private static final String MQTT_URI = "tcp://m2m.eclipse.org:1883";
    private MqttClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            MqttDefaultFilePersistence mdfp = new MqttDefaultFilePersistence(
                    MQTT_DIR);
            client = new MqttClient(MQTT_URI, "1", mdfp);

            client.connect();
            client.subscribe("123456789");
            client.setCallback(new MqttCallback() {

                @Override
                public void connectionLost(Throwable arg0) {
                    // TODO Auto-generated method stub
                    System.out.println("Connection lost");
                    try {
                        client.connect();
                    } catch (MqttException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void messageArrived(String arg0, MqttMessage arg1)
                        throws Exception {
                    // TODO Auto-generated method stub
                    TextView txt = (TextView) findViewById(R.id.txt);
                    txt.setText(arg1.toString());
                }
            });

            Button btn = (Button) findViewById(R.id.btn);
            btn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    try {
                        MqttMessage msg = new MqttMessage();
                        msg.setPayload((((EditText) findViewById(R.id.editTxt))
                                .getText().toString()).getBytes());
                        client.publish("123456789", msg);
                    } catch (MqttException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
        } catch (MqttException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
  

Новая информация
Если я использую org.eclipse.paho.client.mqttv3.jar приложение работает нормально.
Проблема только с org.eclipse.paho.client.mqttv3-0.9.0.jar

Комментарии:

1. Возрождение старого сообщения, но удалось ли вам решить проблему? Застрял на чем-то подобном.

2. Это было давно, так что, возможно, я неправильно помню, но я думаю, что в то время я решил свою проблему, используя другую банку, как я описал в разделе «Новая информация» вопроса

3. Спасибо! Удалось решить эту проблему. Моя собственная глупая ошибка.

4. @shshnk У меня похожая проблема, как вы ее решили?

Ответ №1:

Возможно, ваш брокер использует версию спецификации 3.1.1.

Paho 1.0 реализует MQTT 3.1.1, а также существующую спецификацию MQTT 3.1. В то время как в Paho 0.9 реализована только спецификация MQTT 3.1.

Комментарии:

1. org.eclipse.paho.client.mqttv3.jar то, что я использую, — это версия старше, чем org.eclipse.paho.client.mqttv3-0.9.0.jar

2. Я бы посоветовал просто загрузить последнюю версию: repo.eclipse.org/content/repositories/paho-releases/org/eclipse /…

Ответ №2:

Вам не нужно менять сервер, пожалуйста, установите версию протокола

Blockquote connOpts.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);

Ответ №3:

 @Override
            public void messageArrived(String arg0, MqttMessage arg1)
                    throws Exception {
                // TODO Auto-generated method stub
                TextView txt = (TextView) findViewById(R.id.txt);
                txt.setText(arg1.toString());
            }
  

Это не в MainThread, поэтому setText вызовет исключение.Удалите его и повторите попытку.