【问题标题】:Android AllJoyn: Connection with second machine gives error of BusAttachementAndroid AllJoyn:与第二台机器的连接给出了 BusAttachement 错误
【发布时间】:2016-06-08 05:19:08
【问题描述】:

我为两种不同的传感器开发了应用程序。它们分别工作正常,但是当我尝试将它们一起使用并创建两个不同的总线时,Alljoyn 给出了这个异常。

org.alljoyn.services.common.BusAlreadyExistException: 对象有 之前已使用 BusAttachment 设置。

以下是我的连接源代码。谁能告诉我为什么会出现这个问题。

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

            }


        }

【问题讨论】:

  • 您应该调用registerBusObject 两次(每个传感器一次)并只创建一个总线附件
  • 我试过这个但没有成功。现在我在两个不同的类中创建了两个不同的 busAttachment 对象,但是发生了同样的错误。现在我该如何解决这个问题?
  • 抛出BusAlreadyExistException的那一行?
  • @Lino 我在这个链接上发现了问题。 aboutClient.startAboutClient(bus);

标签: android sensors android-sensors iot alljoyn


【解决方案1】:

使用registerBusObject twince,然后你可以制作一个信号总线附件

【讨论】:

    【解决方案2】:

    为什么不创建两个接口,一个接口分别用于一个传感器。然后将这两个接口添加到实现这两个接口和busObject的类中,并将该类的实现注册为BusObject。

    例如

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

    创建一个新类 Sensor_InterfaceList 来实现两个接口和 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");
    

    这应该可以解决您的问题:)

    【讨论】:

    • 或者您也可以在同一总线上添加两个对象,但路径不同。示例myBus.registerBusObject(mySensor1,"/my/path1"); myBus.registerBusObject(mySensor2,"/my/path2");
    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2016-01-07
    • 2012-02-22
    相关资源
    最近更新 更多