我试图在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
答案 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并重试。