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