/* FoundAdvertisedName callback */ void AJ_CALL found_advertised_name(const void* context, const char* name, alljoyn_transportmask transport, const char* namePrefix) { QCC_UNUSED(context); printf("found_advertised_name(name=%s, prefix=%s, transport=0x%x)\n", name, namePrefix, (unsigned int)transport); /* * The access to global variable s_joinInitiated is serialized across multiple found_advertised_name callbacks * by accessing it only before calling alljoyn_busattachment_enableconcurrentcallbacks. */ if ((QCC_FALSE == s_joinInitiated) && (0 == strcmp(name, OBJECT_NAME))) { /* We found a remote bus that is advertising basic service's well-known name, so connect to it */ alljoyn_sessionopts opts = alljoyn_sessionopts_create(ALLJOYN_TRAFFIC_TYPE_MESSAGES, QCC_FALSE, ALLJOYN_PROXIMITY_ANY, ALLJOYN_TRANSPORT_ANY); if (NULL != opts) { QStatus status; s_joinInitiated = QCC_TRUE; /* alljoyn_busattachment_joinsession might block for a while, so allow other callbacks to run in parallel with it */ alljoyn_busattachment_enableconcurrentcallbacks(s_msgBus); status = alljoyn_busattachment_joinsession(s_msgBus, name, SERVICE_PORT, NULL, &s_sessionId, opts); if (ER_OK != status) { printf("alljoyn_busattachment_joinsession failed (status=%s)\n", QCC_StatusText(status)); } else { printf("alljoyn_busattachment_joinsession SUCCESS (Session id=%u)\n", (unsigned int)s_sessionId); } alljoyn_sessionopts_destroy(opts); s_joinComplete = QCC_TRUE; } } }
/* FoundAdvertisedName callback */ void AJ_CALL found_advertised_name(const void* context, const char* name, alljoyn_transportmask transport, const char* namePrefix) { printf("[Callback] found_advertised_name(name=%s, prefix=%s)\n", name, namePrefix); if (0 == strcmp(name, OBJECT_NAME)) { /* We found a remote bus that is advertising basic service's well-known name so connect to it */ alljoyn_sessionopts opts = alljoyn_sessionopts_create(ALLJOYN_TRAFFIC_TYPE_MESSAGES, QCC_FALSE, ALLJOYN_PROXIMITY_ANY, ALLJOYN_TRANSPORT_ANY); QStatus status; /* enable concurrent callbacks so joinsession can be called */ alljoyn_busattachment_enableconcurrentcallbacks(g_msgBus); status = alljoyn_busattachment_joinsession(g_msgBus, name, SERVICE_PORT, NULL, &s_sessionId, opts); if (ER_OK != status) { printf("alljoyn_busattachment_joinsession failed (status=%s)\n", QCC_StatusText(status)); } else { printf("alljoyn_busattachment_joinsession SUCCESS (Session id=%d)\n", s_sessionId); } alljoyn_sessionopts_destroy(opts); } s_joinComplete = QCC_TRUE; }
int main(int argc, char** argv) { QStatus status = ER_OK; const char* keyStore = NULL; int i = 0; alljoyn_interfacedescription intf = NULL; alljoyn_interfacedescription intfvalue = NULL; /* SessionPort Listeners. */ alljoyn_sessionportlistener_callbacks spl_cbs = { &accept_session_joiner, &session_joined }; /* SessionPort Listeners. */ alljoyn_sessionlistener_callbacks sl_cbs = { &session_lost, //session lost callback NULL, //session member added callback NULL //session member lost callback }; /* Bus Object callbacks */ alljoyn_busobject_callbacks busObjCbs = { &property_get, &property_set, &busobject_object_registered, &busobject_object_unregistered }; /* Auth listener callbacks. */ alljoyn_authlistenerasync_callbacks authcbs = { request_credentials_async, verify_credentials_async, security_violation, authentication_complete }; alljoyn_authlistener authListener; printf("AllJoyn Library version: %s\n", alljoyn_getversion()); printf("AllJoyn Library build info: %s\n", alljoyn_getbuildinfo()); /* Install SIGINT handler */ signal(SIGINT, SigIntHandler); g_wellKnownName = (char*)DEFAULT_WELLKNOWN_NAME; g_sessionOpts = alljoyn_sessionopts_create(ALLJOYN_TRAFFIC_TYPE_MESSAGES, QCC_FALSE, ALLJOYN_PROXIMITY_ANY, ALLJOYN_TRANSPORT_ANY); /* Parse command line args */ for (i = 1; i < argc; ++i) { if (0 == strcmp("-h", argv[i]) || 0 == strcmp("-?", argv[i])) { usage(); exit(0); } else if (0 == strcmp("-p", argv[i])) { if (g_echo_signal) { printf("options -e and -p are mutually exclusive\n"); usage(); exit(1); } g_ping_back = QCC_TRUE; } else if (0 == strcmp("-e", argv[i])) { if (g_ping_back) { printf("options -p and -e are mutually exclusive\n"); usage(); exit(1); } g_echo_signal = QCC_TRUE;; } else if (0 == strcmp("-x", argv[i])) { g_compress = QCC_TRUE; } else if (0 == strcmp("-i", argv[i])) { ++i; if (i == argc) { printf("option %s requires a parameter\n", argv[i - 1]); usage(); exit(1); } else { g_reportInterval = strtoul(argv[i], NULL, 10); } } else if (0 == strcmp("-n", argv[i])) { ++i; if (i == argc) { printf("option %s requires a parameter\n", argv[i - 1]); usage(); exit(1); } else { g_wellKnownName = argv[i]; } } else if (0 == strcmp("-k", argv[i])) { ++i; if (i == argc) { printf("option %s requires a parameter\n", argv[i - 1]); usage(); exit(1); } else { keyStore = argv[i]; } } else if (0 == strcmp("-kx", argv[i])) { ++i; if (i == argc) { printf("option %s requires a parameter\n", argv[i - 1]); usage(); exit(1); } else { g_keyExpiration = strtoul(argv[i], NULL, 10); } } else if (0 == strcmp("-m", argv[i])) { alljoyn_sessionopts_set_multipoint(g_sessionOpts, QCC_TRUE); } else if (0 == strcmp("-t", argv[i])) { alljoyn_sessionopts_set_transports(g_sessionOpts, ALLJOYN_TRANSPORT_TCP); } else if (0 == strcmp("-u", argv[i])) { alljoyn_sessionopts_set_transports(g_sessionOpts, ALLJOYN_TRANSPORT_UDP); } else if (0 == strcmp("-l", argv[i])) { alljoyn_sessionopts_set_transports(g_sessionOpts, ALLJOYN_TRANSPORT_LOCAL); } else if (0 == strcmp("-a", argv[i])) { g_cancelAdvertise = QCC_TRUE; } else { status = ER_FAIL; printf("Unknown option %s\n", argv[i]); usage(); exit(1); } } //Create bus attachment g_msgBus = alljoyn_busattachment_create("bbcservice", QCC_TRUE); //Create and add interfaces to the bus status = alljoyn_busattachment_createinterface(g_msgBus, INTERFACE_NAME, &intf); if (status != ER_OK) { printf("Could not create %s interface because of %s. \n", INTERFACE_NAME, QCC_StatusText(status)); return status; } status = alljoyn_busattachment_createinterface(g_msgBus, INTERFACE_VALUE_NAME, &intfvalue); if (status != ER_OK) { printf("Could not create %s interface because of %s. \n", INTERFACE_VALUE_NAME, QCC_StatusText(status)); return status; } /* Activate org.alljoyn.alljoyn_test */ status = alljoyn_interfacedescription_addmethod(intf, "my_ping", "s", "s", "i,i", 0, NULL); if (status != ER_OK) { printf("Could not add method %s to interface %s because of %s. \n", "my_ping", INTERFACE_NAME, QCC_StatusText(status)); return status; } status = alljoyn_interfacedescription_addmethod(intf, "delayed_ping", "su", "s", "i,i", 0, NULL); if (status != ER_OK) { printf("Could not add method %s to interface %s because of %s. \n", "delayed_ping", INTERFACE_NAME, QCC_StatusText(status)); return status; } status = alljoyn_interfacedescription_addmethod(intf, "time_ping", "uq", "uq", "i,i", 0, NULL); if (status != ER_OK) { printf("Could not add method %s to interface %s because of %s. \n", "time_ping", INTERFACE_NAME, QCC_StatusText(status)); return status; } status = alljoyn_interfacedescription_addmember(intf, ALLJOYN_MESSAGE_SIGNAL, "my_signal", "a{ys}", NULL, "inStr", 0); if (status != ER_OK) { printf("Could not add signal %s to interface %s because of %s. \n", "my_signal", INTERFACE_NAME, QCC_StatusText(status)); return status; } alljoyn_interfacedescription_activate(intf); /*Activate org.alljoyn.alljoyn_test.values */ status = alljoyn_interfacedescription_addproperty(intfvalue, "int_val", "i", ALLJOYN_PROP_ACCESS_RW); if (status != ER_OK) { printf("Could not add property %s to interface %s because of %s. \n", "int_val", INTERFACE_VALUE_NAME, QCC_StatusText(status)); return status; } status = alljoyn_interfacedescription_addproperty(intfvalue, "str_val", "s", ALLJOYN_PROP_ACCESS_RW); if (status != ER_OK) { printf("Could not add method %s to interface %s because of %s. \n", "str_val", INTERFACE_VALUE_NAME, QCC_StatusText(status)); return status; } status = alljoyn_interfacedescription_addproperty(intfvalue, "ro_str", "s", ALLJOYN_PROP_ACCESS_READ); if (status != ER_OK) { printf("Could not add method %s to interface %s because of %s. \n", "ro_str", INTERFACE_VALUE_NAME, QCC_StatusText(status)); return status; } alljoyn_interfacedescription_activate(intfvalue); //Start the bus status = alljoyn_busattachment_start(g_msgBus); if (status != ER_OK) { printf("Could not start the bus because of %s. \n", QCC_StatusText(status)); return status; } //Connect to the bus TODO - change the connect spec status = alljoyn_busattachment_connect(g_msgBus, "null:"); if (status != ER_OK) { printf("Could not connect to the bus because of %s. \n", QCC_StatusText(status)); return status; } /* SessionPort Listeners. */ g_sessionPortListener = alljoyn_sessionportlistener_create(&spl_cbs, NULL); /* SessionPort Listeners. */ g_sessionListener = alljoyn_sessionlistener_create(&sl_cbs, NULL); /* Bus Object call backs. */ g_testObj = alljoyn_busobject_create(OBJECT_PATH, QCC_FALSE, &busObjCbs, NULL); status = bus_object_init(); if (status != ER_OK) { printf("Bus object init failed because of %s. \n", QCC_StatusText(status)); return status; } alljoyn_busattachment_registerbusobject(g_msgBus, g_testObj); /* Auth listener callbacks. */ authListener = alljoyn_authlistenerasync_create(&authcbs, NULL); status = alljoyn_busattachment_enablepeersecurity(g_msgBus, "ALLJOYN_SRP_KEYX ALLJOYN_PIN_KEYX ALLJOYN_RSA_KEYX ALLJOYN_SRP_LOGON", authListener, keyStore, keyStore != NULL); if (ER_OK != status) { printf("enablePeerSecurity failed (%s)\n", QCC_StatusText(status)); return status; } /* Add a logon entry. */ alljoyn_busattachment_addlogonentry(g_msgBus, "ALLJOYN_SRP_LOGON", "sleepy", "123456"); if (ER_OK == status) { printf("bbcservice %s ready to accept connections\n", g_wellKnownName); while (g_interrupt == QCC_FALSE) { #ifdef _WIN32 Sleep(100 * 10 * 300); #else usleep(100 * 1000 * 10 * 300); #endif } } /* Clean up. */ alljoyn_busattachment_unregisterbusobject(g_msgBus, g_testObj); alljoyn_sessionopts_destroy(g_sessionOpts); alljoyn_authlistenerasync_destroy(authListener); alljoyn_busobject_destroy(g_testObj); alljoyn_sessionportlistener_destroy(g_sessionPortListener); alljoyn_sessionlistener_destroy(g_sessionListener); alljoyn_busattachment_destroy(g_msgBus); return 0; }
/** Main entry point */ int CDECL_CALL main(void) { QStatus status = ER_OK; char* connectArgs = "unix:abstract=alljoyn"; alljoyn_interfacedescription testIntf = NULL; alljoyn_busobject_callbacks busObjCbs = { NULL, NULL, &busobject_object_registered, NULL }; alljoyn_busobject testObj = NULL; alljoyn_interfacedescription exampleIntf; alljoyn_interfacedescription_member cat_member; QCC_BOOL foundMember = QCC_FALSE; alljoyn_busobject_methodentry methodEntries[] = { { &cat_member, cat_method }, }; alljoyn_sessionportlistener_callbacks spl_cbs = { accept_session_joiner, NULL }; alljoyn_sessionopts opts = NULL; if (alljoyn_init() != ER_OK) { return 1; } #ifdef ROUTER if (alljoyn_routerinit() != ER_OK) { alljoyn_shutdown(); return 1; } #endif printf("AllJoyn Library version: %s\n", alljoyn_getversion()); printf("AllJoyn Library build info: %s\n", alljoyn_getbuildinfo()); /* Install SIGINT handler */ signal(SIGINT, SigIntHandler); /* Create message bus */ g_msgBus = alljoyn_busattachment_create("myApp", QCC_TRUE); if (g_msgBus != NULL) { /* Add org.alljoyn.Bus.method_sample interface */ status = alljoyn_busattachment_createinterface(g_msgBus, INTERFACE_NAME, &testIntf); if (status == ER_OK) { alljoyn_interfacedescription_addmember(testIntf, ALLJOYN_MESSAGE_METHOD_CALL, "cat", "ss", "s", "inStr1,inStr2,outStr", 0); alljoyn_interfacedescription_activate(testIntf); printf("Interface Created.\n"); } else { printf("Failed to create interface 'org.alljoyn.Bus.method_sample'\n"); } /* Register a bus listener */ if (ER_OK == status) { /* Create a bus listener */ alljoyn_buslistener_callbacks callbacks = { NULL, NULL, NULL, NULL, &name_owner_changed, NULL, NULL, NULL }; g_busListener = alljoyn_buslistener_create(&callbacks, NULL); alljoyn_busattachment_registerbuslistener(g_msgBus, g_busListener); } /* Set up bus object */ testObj = alljoyn_busobject_create(OBJECT_PATH, QCC_FALSE, &busObjCbs, NULL); exampleIntf = alljoyn_busattachment_getinterface(g_msgBus, INTERFACE_NAME); assert(exampleIntf); alljoyn_busobject_addinterface(testObj, exampleIntf); foundMember = alljoyn_interfacedescription_getmember(exampleIntf, "cat", &cat_member); assert(foundMember == QCC_TRUE); if (!foundMember) { printf("Failed to get cat member of interface\n"); } status = alljoyn_busobject_addmethodhandlers(testObj, methodEntries, sizeof(methodEntries) / sizeof(methodEntries[0])); if (ER_OK != status) { printf("Failed to register method handlers for BasicSampleObject\n"); } /* Start the msg bus */ status = alljoyn_busattachment_start(g_msgBus); if (ER_OK == status) { printf("alljoyn_busattachment started.\n"); /* Register local objects and connect to the daemon */ status = alljoyn_busattachment_registerbusobject(g_msgBus, testObj); /* Create the client-side endpoint */ if (ER_OK == status) { status = alljoyn_busattachment_connect(g_msgBus, connectArgs); if (ER_OK != status) { printf("alljoyn_busattachment_connect(\"%s\") failed\n", (connectArgs) ? connectArgs : "NULL"); } else { printf("alljoyn_busattachment connected to \"%s\"\n", alljoyn_busattachment_getconnectspec(g_msgBus)); } } } else { printf("alljoyn_busattachment_start failed\n"); } /* * Advertise this service on the bus * There are three steps to advertising this service on the bus * 1) Request a well-known name that will be used by the client to discover * this service * 2) Create a session * 3) Advertise the well-known name */ /* Request name */ if (ER_OK == status) { uint32_t flags = DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_DO_NOT_QUEUE; QStatus status = alljoyn_busattachment_requestname(g_msgBus, OBJECT_NAME, flags); if (ER_OK != status) { printf("alljoyn_busattachment_requestname(%s) failed (status=%s)\n", OBJECT_NAME, QCC_StatusText(status)); } } /* Create session port listener */ s_sessionPortListener = alljoyn_sessionportlistener_create(&spl_cbs, NULL); /* Create session */ opts = alljoyn_sessionopts_create(ALLJOYN_TRAFFIC_TYPE_MESSAGES, QCC_FALSE, ALLJOYN_PROXIMITY_ANY, ALLJOYN_TRANSPORT_ANY); if (ER_OK == status) { alljoyn_sessionport sp = SERVICE_PORT; status = alljoyn_busattachment_bindsessionport(g_msgBus, &sp, opts, s_sessionPortListener); if (ER_OK != status) { printf("alljoyn_busattachment_bindsessionport failed (%s)\n", QCC_StatusText(status)); } } /* Advertise name */ if (ER_OK == status) { status = alljoyn_busattachment_advertisename(g_msgBus, OBJECT_NAME, alljoyn_sessionopts_get_transports(opts)); if (status != ER_OK) { printf("Failed to advertise name %s (%s)\n", OBJECT_NAME, QCC_StatusText(status)); } } if (ER_OK == status) { while (g_interrupt == QCC_FALSE) { #ifdef _WIN32 Sleep(100); #else usleep(100 * 1000); #endif } } } /* Deallocate sessionopts */ if (opts) { alljoyn_sessionopts_destroy(opts); } /* Deallocate bus */ if (g_msgBus) { alljoyn_busattachment deleteMe = g_msgBus; g_msgBus = NULL; alljoyn_busattachment_destroy(deleteMe); } /* Deallocate bus listener */ if (g_busListener) { alljoyn_buslistener_destroy(g_busListener); } /* Deallocate session port listener */ if (s_sessionPortListener) { alljoyn_sessionportlistener_destroy(s_sessionPortListener); } /* Deallocate the bus object */ if (testObj) { alljoyn_busobject_destroy(testObj); } #ifdef ROUTER alljoyn_routershutdown(); #endif alljoyn_shutdown(); return (int) status; }