私はアンドロイド用の単純なMQTTクライアントを構築していますが、RMBSコンソールで「クライアントIDのソケットエラー」エラーが発生します。これは、クライアントのアンドロイド実装でのみ発生します(私はJavaデスクトップクライアントを作成し、問題なく実行します)。 Androidクライアントの場合、私はPaho Javaクライアントライブラリを訴えています。ここに私のコードは次のとおりです。androidを使用する場合のRSMB MQTTブローカーのクライアントIDのソケットエラー
これは、Androidクライアントです:
package com.example.mqttdroid;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.internal.MemoryPersistence;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;
public class MQTTClient extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mqttclient);
// new BackTask().execute(); not used because (seems to be the problem)
MqttConnectOptions conOpts = new MqttConnectOptions();
conOpts.setKeepAliveInterval(30);
conOpts.setWill(client.getTopic("Error"), "something bad happened".getBytes(), 1, true);
client.connect(conOpts);
client.subscribe("/House/Kitchen/Bulb");
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable arg0) {
// TODO Auto-generated method stub
}
@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
Toast.makeText(Main.this, arg0.toString(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.mqttclient, menu);
return true;
}
/*public class BackTask extends AsyncTask<Void, Void, Void>{
private MqttClient client;
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
client = new MqttClient("tcp://"Ip of machine running RSMB":1883", "ANDROID1", new MemoryPersistence());
client.connect();
client.subscribe("House/Kitchen/Bulb");
} catch (MqttException e) {
// TODO Auto-generated catch block
Log.e("ERROR", "NOT CONNECTED");
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
try {
client.setCallback(new MqttCallback() {
@Override
public void messageArrived(MqttTopic arg0, MqttMessage arg1)
throws Exception {
// TODO Auto-generated method stub
Toast.makeText(MQTTClient.this, arg0.toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void deliveryComplete(MqttDeliveryToken arg0) {
// TODO Auto-generated method stub
}
@Override
public void connectionLost(Throwable arg0) {
// TODO Auto-generated method stub
}
});
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}*/
これは、デスクトップJavaクライアントである:
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttClientPersistence;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.internal.MemoryPersistence;
public class MQTTBaseClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MqttClientPersistence persistence;
try {
MqttClient client = new MqttClient("tcp://localhost:1883", "PC",new MemoryPersistence());
MqttConnectOptions conOpts = new MqttConnectOptions();
conOpts.setKeepAliveInterval(30);
conOpts.setWill(client.getTopic("Error"), "something bad happened".getBytes(), 1, true);
client.connect(conOpts);
MqttMessage msg = new MqttMessage("hello".getBytes());
msg.setQos(0);
msg.setRetained(true);
MqttTopic topic = client.getTopic("House/Kitchen/Bulb");
client.subscribe("House/Kitchen/Bulb");
try {
client.setCallback(new MqttCallback() {
@Override
public void messageArrived(MqttTopic arg0, MqttMessage arg1)
throws Exception {
// TODO Auto-generated method stub
System.out.println(arg1.toString());
}
@Override
public void deliveryComplete(MqttDeliveryToken arg0) {
// TODO Auto-generated method stub
}
@Override
public void connectionLost(Throwable arg0) {
// TODO Auto-generated method stub
}
});
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
topic.publish(msg);
} catch (MqttPersistenceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ちょうど少数のノート:
私は私の上に接続されていますAndroidデバイスをWiFiで接続すると、デスクトップがJava Dekstopクライアントを実行するときにデスクトップに表示されます。
RSMB
は、Javaデスクトップクライアントを作成してsubscirbesトピック「ハウス/キッチン/電球」にし、文字列でメッセージを送信しているJava Destopクライアントが同じマシン上で実行されている「こんにちは」
Androidクライアントは「House/Kitchen/Bulb」にも加入しており、受信したメッセージとともにToastを表示しようとします。
私はAndroidのマニフェストのAndroidデバイス上のインターネット権限をaddededいる
はブローカーうまくに接続するためのようだが、できるだけ早く私は、Javaデスクトップサービスクライアント(またはPAHOクライアントプラグインでの初期化とEclipseを開き、メッセージを公開する)エラーが出てくる。
RSMBが実行されているのと同じマシンでエミュレータを使用してアプリを実行しましたが、同じエラーが発生します。
何が問題なのですか?
UPDATE:
もともと、私は「ネットワークメインスレッドで」例外を得たので、私はAsyncTaskに接続操作を動かします。 Javaクライアントでメッセージを公開すると(Asynctaskが問題を作成している可能性があります)、Androidクライアントがまだ接続されているようですが、MqttCallback()のmessageArrived()は呼び出されていないようです。
更新日2:
私はそれを動作させることができました。ここで私は今使用していますコードです:
package com.example.mqttphone;
*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.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;*
public class Main extends Activity {
protected static String msg;
public MqttClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
client = new MqttClient("tcp://10.1.201.27:1883", "ANDROID1", new MemoryPersistence());
MqttConnectOptions conOpts = new MqttConnectOptions();
conOpts.setKeepAliveInterval(30);
conOpts.setWill(client.getTopic("Error"), "something bad happened".getBytes(), 1, true);
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable arg0) {
// TODO Auto-generated method stub
}
@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
Main.msg = arg1.toString();
Main.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Toast.makeText(Main.this, msg, Toast.LENGTH_LONG).show();
}
});
Log.e("MESSAGE RECEIVED", arg1.toString());
}
});
client.connect(conOpts);
//MqttMessage msg = new MqttMessage("ANDROID MESSAGE".getBytes());
//client.getTopic("world").publish(msg);
if(client.isConnected()){
client.subscribe("/House/Kitchen/Bulb");
Toast.makeText(this, "CONNECTED", Toast.LENGTH_SHORT).show();
}
} catch (MqttException e) {
// TODO Auto-generated catch block
Log.e("ERROR", "NOT CONNECTED");
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;
}
}
解決策を共有するために+1 –
コールバックをconnect()より前に設定する必要があります。そうしないと、正常に動作することが保証されません。実際の例はここにありますhttps://github.com/dobermai/android-mqtt-push –
ソリューションについてはDominikの例を確認してください。さらに、新しいバージョンのPaho Javaクライアント(まだバイナリリリースとしては利用できません)では、APIは少し異なりますが、Androidでの使用に適しています。 http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.java.git/tag/?id=v0.2.1 –