Android上的MQTT:连接丢失

Android上的MQTT:连接丢失,android,mqtt,Android,Mqtt,我试图在Android应用程序上使用MQTT客户端,但无法使其正常工作。 我的MQTT客户端是0.4.0,我的Android是4.0.3 这个应用程序非常简单:它有一个EditText和一个发布文本的按钮。此外,它还有一个文本视图来显示收到的消息 每次单击“发布”按钮时,都会显示“连接丢失”消息,有时会显示两到三次,因为它多次尝试连接,然后断开连接。 另外,如果我不点击按钮,尝试通过另一个客户端发布关于“123456789”主题的消息,则不会发生任何事情(不会显示“消息已到达”消息) 我设置了I

我试图在Android应用程序上使用MQTT客户端,但无法使其正常工作。
我的MQTT客户端是0.4.0,我的Android是4.0.3

这个应用程序非常简单:它有一个EditText和一个发布文本的按钮。此外,它还有一个文本视图来显示收到的消息

每次单击“发布”按钮时,都会显示“连接丢失”消息,有时会显示两到三次,因为它多次尝试连接,然后断开连接。
另外,如果我不点击按钮,尝试通过另一个客户端发布关于“123456789”主题的消息,则不会发生任何事情(不会显示“消息已到达”消息)

我设置了INTERNET和WRITE_EXTERNAL_存储权限,应用程序不会关闭,只是没有发送/接收消息

这是主要的活动

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上,您的代理可能正在使用规范的3.1.1版本

Paho 1.0实现了MQTT 3.1.1以及现有的MQTT 3.1规范。
虽然Paho 0.9仅实现了MQTT 3.1规范。

您不必更改服务器,请设置协议版本

大宗报价 setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1)


它不在主线程中,因此setText将抛出异常。请删除它并重试。

org.eclipse.paho.client.mqttv3.jar我使用的版本比org.eclipse.paho.client.mqttv3-0.9.0.jar旧。我建议只下载最新版本:恢复旧帖子,但您解决了问题吗?这是很久以前的事了,所以我可能记不清了,但我想当时我用另一个罐子解决了我的问题,正如我在问题的“新信息”部分所描述的谢谢!他设法解决了这个问题。我自己的愚蠢错误。@shshnk我也有类似的问题你是怎么解决的?
@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());
            }