#android #mqtt
#Android #mqtt
Вопрос:
Я пытаюсь использовать клиент MQTT в приложении Android, но не могу заставить его работать.
Мой клиент MQTT — 0.4.0, а мой Android — 4.0.3.
Приложение очень простое: в нем есть EditText и кнопка для публикации текста. Кроме того, у него есть TextView для отображения полученного сообщения.
Каждый раз, когда нажимается кнопка «Опубликовать», отображается сообщение «соединение потеряно», иногда два или три раза, поскольку оно несколько раз пыталось подключиться, а затем отключалось.
Кроме того, без нажатия на кнопку, если я попытаюсь опубликовать сообщение в теме «123456789» через другой клиент, ничего не произойдет (сообщение «сообщение получено» не отображается).
Я устанавливаю права доступа к ИНТЕРНЕТУ и 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
Комментарии:
1. Возрождение старого сообщения, но удалось ли вам решить проблему? Застрял на чем-то подобном.
2. Это было давно, так что, возможно, я неправильно помню, но я думаю, что в то время я решил свою проблему, используя другую банку, как я описал в разделе «Новая информация» вопроса
3. Спасибо! Удалось решить эту проблему. Моя собственная глупая ошибка.
4. @shshnk У меня похожая проблема, как вы ее решили?
Ответ №1:
Возможно, ваш брокер использует версию спецификации 3.1.1.
Paho 1.0 реализует MQTT 3.1.1, а также существующую спецификацию MQTT 3.1. В то время как в Paho 0.9 реализована только спецификация MQTT 3.1.
Комментарии:
1. org.eclipse.paho.client.mqttv3.jar то, что я использую, — это версия старше, чем org.eclipse.paho.client.mqttv3-0.9.0.jar
2. Я бы посоветовал просто загрузить последнюю версию: repo.eclipse.org/content/repositories/paho-releases/org/eclipse /…
Ответ №2:
Вам не нужно менять сервер, пожалуйста, установите версию протокола
Blockquote 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 вызовет исключение.Удалите его и повторите попытку.