6

Android 用の単純な MQTT クライアントを構築していますが、RMBS コンソールで「クライアント識別子のソケット エラー」エラーが発生しています。これは、クライアントの Android 実装でのみ発生します (Java デスクトップ クライアントも作成しましたが、問題なく実行されます)。Android クライアントについては、Paho Java クライアント ライブラリを訴えています。これが私のコードです:

これは 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();
    }

}






 }

いくつかのメモ:

私は WiFi 経由で Android デバイスに接続しており、Java Dekstop クライアントを実行するときのデスクトップも同様です。

Java Destop Client が RSMB と同じマシンで実行されている

Java デスクトップ クライアントは、トピック「House/Kitchen/Bulb」を作成してサブスクライブし、文字列「Hello」を含むメッセージを送信します。

Android クライアントは、"House/Kitchen/Bulb" にもサブスクライブし、受信したメッセージでトーストを表示しようとします。

Androidマニフェストにインターネット許可を追加しました

Android デバイスはブローカーに問題なく接続しているようですが、Java Desktop Service クライアント (または Eclipse の Paho クライアント プラグイン) を初期化してメッセージを発行するとすぐに、上記のエラーが表示されます。

RSMB が実行されているのと同じマシンでエミュレーターを使用してアプリを実行しましたが、同じエラーが発生します。

何が問題なのですか?

アップデート:

もともと、「メイン スレッドのネットワーク」例外が発生したため、接続操作を AsyncTask に移動しました。Java クライアントでメッセージを発行すると、Android クライアントはまだ接続されているようですが (Asynctask が問題を引き起こしている可能性があります)、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;
}


}
4

2 に答える 2

3

こんにちは
、あなたのコードを使用しましたが、paho クライアントを apollo サーバーに接続できず、以下のエラーが発生しました。

 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

ありがとう
ギリッシュ

于 2013-05-08T17:23:54.337 に答える