2016-02-25 15 views
12

Ich habe Anwendung für zwei verschiedene Sensoren entwickelt. Sie funktionieren gut getrennt, aber wenn ich versuche, sie zu verwenden, um zwei verschiedene Busse zu erstellen und zu erstellen, gibt Alljoyn diese Ausnahme.Android AllJoyn: Verbindung mit zweiter Maschine gibt Fehler von BusAttachement

org.alljoyn.services.common.BusAlreadyExistException: Das Objekt wurde zuvor mit einem BusAttachment eingestellt.

Unten ist mein Quellcode für die Verbindung. Kann mir jemand sagen, warum ich dieses Problem habe?

private void connect() 
     {   org.alljoyn.bus.alljoyn.DaemonInit.PrepareDaemon(getApplicationContext()); 

      bus = new BusAttachment("ControlPanelBrowser", BusAttachment.RemoteMessage.Receive); 
      bus.registerBusListener(new BusListener()); 


      Status status = bus.registerBusObject(mControlPanelSignalInterface, Constants.SERVICE_PATH); 


      if (status != Status.OK) { 

       Log.d(TAG, "Problem while registering bus object"); 

      } 

      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
      srpPassword = settings.getString(PREFS_PASSWORD, DEFAULT_SECURED_SRP_PASSWORD); 

      SrpAnonymousKeyListener authListener = new SrpAnonymousKeyListener(this, logger, AUTH_MECHANISMS); 
      Status authStatus = bus.registerAuthListener(authListener.getAuthMechanismsAsString(), 
        authListener, getKeyStoreFileName()); 

      if (authStatus != Status.OK) { 
       Log.e(TAG, "Failed to register AuthListener"); 
      } 

      status = bus.connect(); 


      if (Status.OK == status){ 

       String daemonName = Constants.DAEMON_NAME_PREFIX + ".ControlPanelBrowser.G" + 
         bus.getGlobalGUIDString(); 

       int flag = BusAttachment.ALLJOYN_REQUESTNAME_FLAG_DO_NOT_QUEUE; 

       Status reqStatus = bus.requestName(daemonName, flag); 

       if (reqStatus == Status.OK) { 

        Status adStatus = bus.advertiseName(Constants.DAEMON_QUIET_PREFIX + 
          daemonName, SessionOpts.TRANSPORT_ANY); 

        if (adStatus != Status.OK){ 
         bus.releaseName(daemonName); 
         Log.e(TAG, "Failed to advertise daemon name: '" + daemonName + "', Error: '" + status + "'"); 
        } 
        else{ 
         Log.d(TAG, "Succefully advertised daemon name: '" + daemonName + "'"); 
        } 
       } 
       else { 
        Log.e(TAG, "Failed to request daemon name: '" + daemonName + "', Error: '" + status + "'"); 
       } 
      } 


      status = bus.registerSignalHandlers(mControlPanelSignalInterface); 

      if (status != Status.OK) { 
       Log.d(TAG, "Problem while registering signal handlers"); 
      } 

      // Initialize AboutService 

      aboutClient = AboutServiceImpl.getInstance(); 
      aboutClient.setLogger(logger); 
      try { 
       aboutClient.startAboutClient(bus); 

       for (String iface : ANNOUNCE_IFACES) { 


        aboutClient.addAnnouncementHandler(this, new String[] {iface}); 

       } 
      } catch (Exception e) { 

       logger.error(TAG, "Unable to start AboutService, Error: " + e.getMessage()); 

      } 


     } 
+0

Sie anrufen sollte 'registerBusObject 'zweimal (einmal für jeden Sensor) und erstellen nur einen einzigen Bus Anhang – Lino

+0

Ich hatte versucht, diese BU t kein Erfolg. Jetzt erstelle ich zwei verschiedene busAttachment-Objekte in zwei verschiedenen Klassen, aber derselbe Fehler tritt auf. Wie kann ich dieses Problem lösen? –

+0

Welches ist die Zeile, die die 'BusAlreadyExistException' auslöst? – Lino

Antwort

1

Verwendung registerBusObject twince und dann können Sie eine signle Bus Befestigungs

+0

Ich habe dies getan, aber den gleichen Fehler bekommen. –

0

machen, warum nicht Sie zwei Schnittstellen erstellen, eine Schnittstelle für einen Sensor auf. Fügen Sie dann diese beiden Schnittstellen in eine Klasse ein, die diese beiden Schnittstellen und das BusObjekt implementiert, und registrieren Sie eine Implementierung dieser Klasse als BusObject.

Zum Beispiel

Sensor1_interface.java and Sensor2_interface.java //are my two interface classes

eine neue Klasse Sensor_InterfaceList schaffen, die inplements die beiden Schnittstellen und die BusObject

class Sensor_InterfaceList implements Sensor1_interface,Sensor2_interface,BusObject 
    { 
    // implment your interfaces here 
    ..... 
    } 
private Sensor_InterfaceList mySensor_InterfaceList; 
mySensor_InterfaceList = new Sensor_InterfaceList(); 
myBus.registerBusObject(mySensor_InterfaceList,"/your/path"); 

Dieses Ihr Problem lösen sollte :)

+0

oder Sie können auch zwei Objekte auf demselben Bus, aber auf unterschiedlichen Pfaden hinzufügen.beispiel 'myBus.registerBusObject (mySensor1,"/my/path1 "); myBus.registerBusObject (mySensor2, "/ my/path2"); ' –