MQTT на Android: потеряна связь

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

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

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

Ставлю права доступа INTERNET и WRITE_EXTERNAL_STORAGE и приложение не закрывается с исключением, просто сообщения не отправляются / не принимаются.

Это MainActivity

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. банка


person sthor69    schedule 17.06.2014    source источник
comment
Восстановление старого поста, но удалось ли решить проблему? Застрял на чем-то похожем.   -  person shshnk    schedule 20.11.2015
comment
Это было давно, так что, возможно, я не правильно помню, но я думаю, что в то время я решил свою проблему, используя другую банку, как я описал в разделе новой информации вопроса.   -  person sthor69    schedule 20.11.2015
comment
Спасибо! Удалось ее решить. Моя собственная глупая ошибка.   -  person shshnk    schedule 21.11.2015
comment
@shshnk У меня похожая проблема, как вы ее решили?   -  person Ashok    schedule 22.12.2015


Ответы (3)


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

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

person Teixi    schedule 16.07.2014
comment
org.eclipse.paho.client.mqttv3.jar, который я использую, является версией старше org.eclipse.paho.client.mqttv3-0.9.0.jar - person sthor69; 18.07.2014
comment
Я предлагаю просто загрузить последнюю версию: repo.eclipse.org/content/repositories/paho-releases/org/eclipse/ - person Teixi; 18.07.2014

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

Цитата connOpts.setMqttVersion (MqttConnectOptions.MQTT_VERSION_3_1_1);

person Jega    schedule 24.08.2015

@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 выдаст исключение. Удалите его и повторите попытку.

person zbl1622    schedule 03.03.2017