2013-04-17 5 views
6

私はアンドロイド用の単純な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; 
} 


} 
+0

解決策を共有するために+1 –

+0

コールバックをconnect()より前に設定する必要があります。そうしないと、正常に動作することが保証されません。実際の例はここにありますhttps://github.com/dobermai/android-mqtt-push –

+0

ソリューションについてはDominikの例を確認してください。さらに、新しいバージョンのPaho Javaクライアント(まだバイナリリリースとしては利用できません)では、APIは少し異なりますが、Androidでの使用に適しています。 http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.java.git/tag/?id=v0.2.1 –

答えて

1

私が働いてそれを得ました。 githubリポジトリにはlinkがあり、誰でもこのコードを実装したプロジェクトを見つけることができます。それは、ユーザーが音声認識を介してAndroidデバイスを使用してリモートでLEDライトをオンにすることができます。

3

こんにちは
私はあなたのコードを使用していますが、私はエラーの下に取得する必要があり、私のアポロ・サーバに私のPAHOクライアントを接続することはできません。

I/global(677): Default buffer size used in BufferedOutputStream constructor. It would be better to be explicit if an 8k buffer is required. 
E/ERROR(677): NOT CONNECTED 
W/System.err(677): (32109) - java.io.EOFException 
W/System.err(677):  at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:127) 
W/System.err(677):  at java.lang.Thread.run(Thread.java:1096) 
W/System.err(677): Caused by: java.io.EOFException 
W/System.err(677):  at java.io.DataInputStream.readFully(DataInputStream.java:266) 
W/System.err(677):  at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:63) 
W/System.err(677):  at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:94) 
W/System.err(677):  ... 1 more 

おかげ
Girish

+0

遅れて申し訳ありません。 Apolloサーバーでmqttブローカーを実行していますか? – Emmanuel

+0

はい私はアポロサーバーの起動ブローカーがアポロサーバーのトピックを作成するよりも、私はサブスクリプションを試みて、クライアントをサーバーに接続しようとするとエラーが発生し、作成したトピックがapolloサーバーから消えていることがわかりました。 –

+0

これは簡単な質問かもしれませんが、サーバーに正しいIPを使用していますか?また、ブローカーはポート1883を使用していますか? – Emmanuel

関連する問題