2013-04-17 9 views
6

Ich baue einen einfachen MQTT-Client für Android, und ich bekomme den Fehler "Socket-Fehler für Client-ID" auf der RMBS-Konsole. Dies geschieht nur in der Android-Implementierung des Clients (Ich habe auch einen Java-Desktop-Client erstellt und läuft ohne Probleme). Für den Android Client verklag ich die Paho Java Client Bibliotheken. Hier ist mein Code:Socket-Fehler für die Client-ID auf RSMB MQTT Broker bei der Verwendung von Android

Dies ist der Android-Client:

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

}*/ 

Dies ist der Desktop-Java-Client:

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

} 






} 

Nur ein paar Anmerkungen:

ich verbunden bin auf meinem Android-Gerät über WiFi, und so ist mein Desktop, wenn ich den Java Dekstop Client laufen lasse.

Der Java-Destop-Client auf derselben Maschine wie die RSMB läuft

Java Desktop Client erstellt und subscirbes zum Thema „Haus/Küche/Birne“ und sendet eine Nachricht mit dem String „Hallo“

Der Android-Client abonniert auch "Haus/Küche/Glühbirne" und versucht, einen Toast mit der empfangenen Nachricht anzuzeigen.

ich die Internet-Berechtigung auf dem Android-Manifest

das Android-Gerät addeded habe scheint an den Broker ganz gut, aber sobald ich initialisieren das Java Desktop Service-Client (oder die Paho Client-Plug-in in der Verbindung Eclipse und veröffentliche eine Nachricht) Ich bekomme den Fehler erwähnt.

Ich lief die App mit dem Emulator auf der gleichen Maschine der RSMB läuft, und ich bekomme den gleichen Fehler.

Was könnte das Problem sein?

UPDATE:

Ursprünglich Ich habe eine "Netzwerk auf dem Main Thread" Exception, so zog ich die Verbindungsoperation an einen AsyncTask. Nun scheint es, dass der Android-Client immer noch verbunden ist, wenn ich eine Nachricht mit dem Java-Client veröffentliche (Asynctask könnte Probleme verursacht haben), aber die messageArrived() von MqttCallback() scheint nicht aufgerufen zu werden.

UPDATE 2:

ich es geschafft, es funktioniert. Hier ist der Code Ich benutze jetzt:

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 für die gemeinsame Nutzung der Lösung –

+0

Sie müssen den Callback _before_ connect() einstellen, sonst funktioniert es nicht garantiert. Ein funktionierendes Beispiel finden Sie hier https://github.com/dobermai/android-mqtt-push –

+0

Überprüfen Dominiks Beispiel für die Lösung. Darüber hinaus hat die neuere Version des Paho Java-Clients (die noch nicht als Binärversion verfügbar ist) Verbesserungen, die sie für die Verwendung unter Android geeignet machen, obwohl die API ein wenig anders ist. http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.java.git/tag/?id=v0.2.1 –

Antwort

1

habe ich es zu arbeiten. Hier ist ein link zum github-Repository, wo jeder ein Projekt finden kann, das diesen Code implementiert. Es ermöglicht Benutzern, ein LED-Licht aus der Ferne mit ihrem Android-Gerät über Spracherkennung einzuschalten.

3

Hallo
Ich habe den Code verwenden, aber ich kann meine paho Client zu meinem apollo Server Ich habe keine Verbindung unten Fehler.

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 

Dank
Girish

+0

Entschuldigung für die späte Antwort. Haben Sie einen mqtt-Broker, der auf dem Apollo-Server läuft? – Emmanuel

+0

Ja Ich habe Brocker auf Apollo-Server als Thema auf Apollo-Server zu erstellen, als ich versuche, Client zu Server zu abonnieren und zu diesem Zeitpunkt zu verbinden, habe ich oberen Fehler und ich fand, dass meine erstellte Thema von Apollo-Server verschwindet. –

+0

Das ist vielleicht eine triviale Frage, aber verwenden Sie die richtige IP für Ihren Server? Verwendet der Broker Port 1883? – Emmanuel

Verwandte Themen