Android上的MQTT:连接丢失

时间:2014-06-17 08:16:32

标签: android mqtt

我试图在Android应用程序上使用MQTT客户端,但我无法使其正常工作 我的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.jar

3 个答案:

答案 0 :(得分:3)

您的经纪人可能正在使用规范3.1.1版。

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

答案 1 :(得分:1)

您无需更改服务器,请设置协议版本

  

块引用                   connOpts.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);

答案 2 :(得分:-1)

@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将抛出Exception.Delete并重试。