【问题标题】:MQTT on Android: connection lostAndroid 上的 MQTT:连接丢失
【发布时间】:2014-08-07 04:12:12
【问题描述】:

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

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

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

我同时设置了 INTERNET 和 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

【问题讨论】:

  • 恢复旧帖子,但您设法解决了问题吗?卡在类似的东西上。
  • 这是很久以前的事了,所以也许我记错了,但我认为当时我使用不同的 jar 解决了我的问题,正如我在“新信息”部分中所述问题
  • 谢谢!设法解决它。我自己的愚蠢错误。
  • @shshnk 我有类似的问题,你是怎么解决的?

标签: android mqtt


【解决方案1】:

您的代理可能正在使用规范的 3.1.1 版本。

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

【讨论】:

【解决方案2】:

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

块引用 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会抛出异常。删除后重试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多