コード例 #1
0
        public static void Main()
        {
            #region Initialize AlljoynSecurityService

            // Define device interface. Interfaces beginning with
            // dollar sign ('$') are deemed secure
            string[] deviceInterface =
            {
                "$org.alljoyn.bus.samples.secure.SecureInterface",
                "?Ping inStr<s outStr>s",
                " "
            };

            UInt32 AJ_METHOD_ACCEPT_SESSION = AJ.BusMessageId(2, 0, 0);
            UInt32 AJ_SIGNAL_SESSION_JOINED = AJ.BusMessageId(2, 0, 1);
            UInt32 BASIC_SERVICE_PING       = AJ.AppMessageId(0, 0, 0);

            bool         connected = false;
            const ushort port      = 0;
            UInt32       bus       = 0;
            var          msg       = new AJ_Message();
            var          myAlljoyn = new AJ();

            // Initialize Alljoyn object
            myAlljoyn.CreateBus(ref bus);
            myAlljoyn.Initialize();
            myAlljoyn.RegisterObjectsInterface(new AJ_Object()
            {
                path = ServicePath, interfaces = deviceInterface
            }, false, true);

            #endregion

            // Attach to Netowrk Link state change notifications
            var netmon = new NetworkStateMonitor();

            // Start the message processing loop
            while (true)
            {
                netmon.WaitForIpAddress();
                AJ_Status status;
                if (!connected)
                {
                    status = myAlljoyn.StartService(bus, DaemonServiceName, CONNECT_TIMEOUT, AJ.AJ_FALSE, ServicePort, ServiceName, AJ.AJ_NAME_REQ_DO_NOT_QUEUE);
                    if (status != AJ_Status.AJ_OK)
                    {
                        Debug.Print(status.ToString());
                        continue;
                    }

                    Debug.Print("StartService returned AJ_OK; running \n");
                    connected = true;

                    // Provide credentials for all security
                    // suites by setting write-only properties

                    myAlljoyn.KeyExpiration = KeyExpiration;
                    myAlljoyn.PskHint       = PskHint;
                    myAlljoyn.PskString     = PskChar;
                    myAlljoyn.PemPriv       = PemPrv;
                    myAlljoyn.PemX509       = PemX509;

                    // Enable security suites
                    myAlljoyn.EnableSecurity(bus, SecuritySuites);

                    // once connected to the Alljoyn router do the "About" annoucement
                    if (status == AJ_Status.AJ_OK)
                    {
                        myAlljoyn.doAnnounce = true;
                        myAlljoyn.AboutAnnounce(bus, ServicePort);
                    }
                }

                // wait for a message from the router
                status = myAlljoyn.UnmarshalMsg(bus, msg, UNMARSHAL_TIMEOUT);
                if (status == AJ_Status.AJ_ERR_TIMEOUT)
                {
                    Debug.Print("do work\n");
                    continue;
                }

                // if the message is ok, check for message types this app wants to handle
                if (status == AJ_Status.AJ_OK)
                {
                    string str = "Received message + msgId=" + msg.msgId.ToString("X") + "\n";
                    Debug.Print(str);

                    // Session connection from a client?
                    if (msg.msgId == AJ_METHOD_ACCEPT_SESSION)
                    {
                        string joiner    = "";
                        UInt32 sessionId = 0;

                        myAlljoyn.UnmarshalArgs(msg, "qus", port, sessionId, joiner);
                        status = myAlljoyn.BusReplyAcceptSession(msg, 1);
                        if (status == AJ_Status.AJ_OK)
                        {
                            Debug.Print("Accepted session session_id \n");
                        }
                        else
                        {
                            Debug.Print("AJ_BusReplyAcceptSession: error \n");
                        }
                    }  // Session connected
                    else if (msg.msgId == BASIC_SERVICE_PING)
                    {
                        status = AppHandlePing(msg, myAlljoyn);
                    }
                    else if (msg.msgId == AJ_SIGNAL_SESSION_JOINED)
                    {
                        // do nothing...
                    }    // Request to read an interface property
                    else // default handling (pass it on to the bus)
                    {
                        myAlljoyn.BusHandleBusMessage(msg, bus, ServicePort);
                    }
                }
                myAlljoyn.CloseMsg(msg);

                if (status == AJ_Status.AJ_ERR_READ)
                {
                    Debug.Print("AllJoyn disconnect\n");
                    myAlljoyn.Disconnect(bus);
                    connected = false;

                    // sleep a little while before trying to connect again
                    myAlljoyn.Sleep(10 * 1000);
                }
            }
        }
コード例 #2
0
        public static void Main()
        {
            // Define device interface. Interfaces beginning with
            // dollar sign ('$') are deemed secure
            string[] deviceInterface =
            {
                "$org.alljoyn.bus.samples.secure.SecureInterface",
                "?Ping inStr<s outStr>s",
                " "
            };

            AJ_Status status     = AJ_Status.AJ_OK;
            AJ_Status authStatus = AJ_Status.AJ_ERR_NULL;
            UInt32    bus        = 0;
            bool      connected  = false;
            bool      done       = false;
            UInt32    sessionId  = 0;
            AJ        myAlljoyn  = new AJ();

            // Initialize Alljoyn object
            myAlljoyn.CreateBus(ref bus);
            myAlljoyn.Initialize();
            myAlljoyn.RegisterObjectsInterface(new AJ_Object()
            {
                path = ServicePath, interfaces = deviceInterface
            }, false, false);

            // Attach to Netowrk Link state change notifications
            var netmon = new NetworkStateMonitor();

            while (!done)
            {
                netmon.WaitForIpAddress();

                AJ_Message msg = new AJ_Message();

                if (!connected)
                {
                    // the original AJ_StartClientByName is splitted into 3 functions instead of one, as it will block the other CLR functions
                    // and have a more efficient connection, especially when the service it is looking for is not existed yet. Instead of
                    // keep connect and disconnect to router, send the findserive, we can just wait at the 3rd stage,ClientConnectservice.
                    //
                    // 1st stage - ClientconnectBus , found router and attached bus to it, wait until router found or timeout is set.
                    // 2nd stage - ClientFindService, Adverstise the service it is looking for
                    // 3rd stage - ClientConnectService, Connect to the services it is looking for, it will wait until the service pop up or timeout is set,

                    do
                    {
                        status = myAlljoyn.ClientConnectBus(bus,
                                                            null,
                                                            CONNECT_TIMEOUT);
                    }while (status != AJ_Status.AJ_OK);

                    do
                    {
                        status = myAlljoyn.ClientFindService(bus,
                                                             ServiceName,
                                                             null,
                                                             CONNECT_TIMEOUT);
                    }while (status != AJ_Status.AJ_OK);
                    int retry = 0;
                    do
                    {
                        status = myAlljoyn.ClientConnectService(bus,
                                                                CONNECT_TIMEOUT,
                                                                ServiceName,
                                                                ServicePort,
                                                                ref sessionId,
                                                                null,
                                                                ref FullServiceName);
                        // user can break from this call, instead of having a while loop
                        retry++;
                        if (retry > 10)
                        {
                            break;
                        }
                    } while (status != AJ_Status.AJ_OK);
                    // if break from here, need to call myAlljoyn.Disconnect(bus);
                    if (status != AJ_Status.AJ_OK)
                    {
                        myAlljoyn.Disconnect(bus);
                    }

                    if (status == AJ_Status.AJ_OK)
                    {
                        connected  = true;
                        authStatus = AJ_Status.AJ_ERR_NULL;

                        // Provide credentials for all security
                        // suites by setting write-only properties.
                        // Only the security suites specified
                        // in SecuritySuites will be used
                        myAlljoyn.KeyExpiration = KeyExpiration;
                        myAlljoyn.PskHint       = PskHint;
                        myAlljoyn.PskString     = PskChar;
                        myAlljoyn.PemPriv       = PemPrv;
                        myAlljoyn.PemX509       = PemX509;

                        // Enable security suites
                        myAlljoyn.EnableSecurity(bus, SecuritySuites);

                        // Clear any stored credentials
                        myAlljoyn.ClearCredentials();

                        // Begin authentication process with the service. This is
                        // an asynchronous process so we will need to poll the
                        // authStatus value during the main message processing loop
                        status = myAlljoyn.AuthenticatePeer(bus, FullServiceName);

                        if (status != AJ_Status.AJ_OK)
                        {
                            Debug.Print("AJ_BusAuthenticatePeer returned " + status.ToString());
                            break;
                        }
                    }
                    else
                    {
                        continue;
                    }
                }

                // Poll for authStatus to determine when
                // authentication handshaking is complete.

                authStatus = myAlljoyn.GetAuthStatus();
                if (authStatus != AJ_Status.AJ_ERR_NULL)
                {
                    if (authStatus != AJ_Status.AJ_OK)
                    {
                        myAlljoyn.Disconnect(bus);
                        break;
                    }

                    // We set the authStatus to NULL when the
                    // handshaking is finished to indicate that
                    // we should proceed with normal alljoyn
                    // message processing
                    myAlljoyn.SetAuthStatus(AJ_Status.AJ_ERR_NULL);

                    // Make ping method call to service
                    status = SendPing(bus, sessionId, myAlljoyn);
                    if (status != AJ_Status.AJ_OK)
                    {
                        Debug.Print("SendPing returned " + status.ToString());
                        continue;
                    }
                }

                // process messages from the router
                status = myAlljoyn.UnmarshalMsg(bus, msg, UNMARSHAL_TIMEOUT);
                if (AJ_Status.AJ_ERR_TIMEOUT == status)
                {
                    continue;
                }

                if (AJ_Status.AJ_OK == status)
                {
                    // Handle Ping response
                    if (msg.msgId == AJ_REPLY_ID(PING_METHOD))
                    {
                        UInt32 argPtr = myAlljoyn.GetArgPtr(4);

                        if (AJ_Status.AJ_OK == myAlljoyn.UnmarshalArg(msg, argPtr))
                        {
                            string value = myAlljoyn.GetArgString(4);
                            if (value == pingString)
                            {
                                Debug.Print("Ping was successful");
                            }
                            else
                            {
                                Debug.Print("Ping returned different string");
                            }
                        }
                        else
                        {
                        }

                        done = true;
                    }
                    else if (msg.msgId == AJ_SIGNAL_SESSION_LOST_WITH_REASON)
                    {
                        // Just eating the reason for this demo, in production
                        // reason should be inspected and acted upon
                        {
                            UInt32 id = 0, reason = 0;
                            myAlljoyn.UnmarshalArgs(msg, "uu", ref id, ref reason);
                        }
                        status = AJ_Status.AJ_ERR_SESSION_LOST;
                    }
                    else
                    {
                        // Pass to the built-in handlers
                        status = myAlljoyn.BusHandleBusMessage(msg, bus, ServicePort);
                    }
                }

                // Clean up
                myAlljoyn.CloseMsg(msg);

                if (status == AJ_Status.AJ_ERR_SESSION_LOST)
                {
                    myAlljoyn.Disconnect(bus);
                }
            }
        }