2016-02-25 26 views
12

Ho sviluppato un'applicazione per due diversi sensori. Stanno lavorando bene separatamente, ma quando provo ad usarli insieme e creare due bus diversi da Alljoyn dà questa eccezione.Android AllJoyn: la connessione con la seconda macchina restituisce l'errore BusAttachement

org.alljoyn.services.common.BusAlreadyExistException: L'oggetto è stato impostato in precedenza con un BusAttachment.

Di seguito è riportato il mio codice sorgente per la connessione. Qualcuno può dirmi perché sto avendo questo problema.

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

si dovrebbe chiamare 'registerBusObject 'due volte (una volta per ogni sensore) e creando un solo collegamento bus singolo – Lino

+0

Ho provato questo bu t nessun successo. Ora sto creando due oggetti busAttachment diversi in due classi diverse ma si verifica lo stesso errore. Ora come posso risolvere questo problema? –

+0

qual è la linea che lancia il 'BusAlreadyExistException'? – Lino

risposta

1

uso registerBusObject twince e poi si può fare un attacco bus signle

+0

Ho fatto questo ma ho ottenuto lo stesso errore. –

0

Perché non si crea due interfacce, una sola interfaccia, rispettivamente, per un sensore. quindi aggiungi queste due interfacce in una classe che implementa queste due interfacce e busObject e registra un'implementazione di questa classe come BusObject.

Per esempio

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

creare una nuova classe che Sensor_InterfaceList inplements le due interfacce e la 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"); 

Questo dovrebbe risolvere il problema :)

+0

oppure puoi anche aggiungere due oggetti sullo stesso bus ma su percorsi diversi.esempio 'myBus.registerBusObject (mySensor1,"/my/path1 "); myBus.registerBusObject (mySensor2, "/ my/percorso2"); ' –