Ejemplo n.º 1
0
        /// <summary>
        /// Call the SensorValues service and show the results in the console window.
        /// </summary>
        /// <param name="endpointAddress">The address the service will be called.</param>
        public static SSimpSample InvokeService(EndpointAddress endpointAddress, bool silent)
        {
            // Create a client (get the settings in the app.config);
            using (SensorValuesClient client =
                       new SensorValuesClient(new InstanceContext(new DiscoveryCallBack()), "SensorValues"))
            {
                // Connect to the discovered service endpoint.
                client.Endpoint.Address = endpointAddress;
                client.Endpoint.Binding.ReceiveTimeout = new TimeSpan(0, 0, 2);

                ////Get the ClientBaseAddress, to change from Localhost to an specific IP Address;
                //CustomBinding binding = (CustomBinding)client.Endpoint.Binding;
                //Uri baseAddress = ((CompositeDuplexBindingElement)binding.Elements[0]).ClientBaseAddress;

                //if (baseAddress != null)
                //{
                //    // Get the Client Machine Name (NB. Use the IP address as can be problems using the name)
                //    string myClientMachineName = System.Net.Dns.GetHostName();
                //    System.Net.IPHostEntry myClientMachineAddressList = System.Net.Dns.GetHostEntry(myClientMachineName);
                //    string myClientMachineIP = myClientMachineName;
                //    foreach (System.Net.IPAddress ip in myClientMachineAddressList.AddressList)
                //    {
                //        // Make sure to get the IPv4 address;
                //        if (!(ip.IsIPv6LinkLocal || ip.IsIPv6Multicast || ip.IsIPv6SiteLocal || ip.IsIPv6Teredo))
                //        {
                //            myClientMachineIP = ip.ToString();
                //            break;
                //        }
                //    }
                //    ((CompositeDuplexBindingElement)binding.Elements[0]).ClientBaseAddress = new Uri(baseAddress.AbsoluteUri.Replace("localhost", myClientMachineIP));
                //}

                // Call the service.
                if (!silent)
                {
                    Console.WriteLine("Invoking at {0}", endpointAddress);
                }

                client.Open();
                SSimpSample response;

                do
                {
                    response = client.GetSensorValues();

                    // Show the results in the console window.
                    if (!silent)
                    {
                        ShowValues(response);
                        Console.WriteLine("Read Again?");
                    }
                } while (!silent && (Console.ReadKey().Key == ConsoleKey.Y));
                // Closing the client gracefully closes the connection and cleans up resources.
                client.Close();

                // Return the Values;
                return(response);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Initial point of the program.
        /// </summary>
        /// <param name="args">Arguments.</param>
        public static void Main(string[] args)
        {
            // Check if the console application will continually run.
            bool continuousRun = false;

            if (args.Length > 0 && args[0].ToLower() == "-o")
            {
                continuousRun = (args.Length > 1 && args[1].ToLower() == "continous");
            }

            // Write the header.
            Console.WriteLine(
                @"ABB  DECRC - SERVICE and usability LAB
Advanced Identification and Labeling for Service
DECRC 2009
DPWS Discovery Project,
Contact N. L. Fantana ([email protected])

 * Please, start Gateway before select the options.
   Additionally a running dummynode is required when using manual discovery (Option D) 
");
            // Go always into the menu, until the user selects to exit.
            while (true)
            {
                // Check the option.
                ConsoleKeyInfo ki = new ConsoleKeyInfo();
                Console.Write(
                    @"Select one option: 
   A-Wait for Announcement;
   C-Configuration Sample;
   D-Discover the service;
   I-Invoke the service;
   S-Eventing Subscribe; 
   P-Performance Test; 
   E-Exit
Select: ");
                ki = Console.ReadKey();
                Console.WriteLine();


                switch (ki.Key)
                {
                // Start the announcement procedure.
                case ConsoleKey.A:
                    StartAnouncementProcess();
                    break;

                // Call the Configuration Method.
                case ConsoleKey.C:
                    if (hostedEndPoint != null)
                    {
                        ConfigureNodes(hostedEndPoint, false);
                    }
                    break;

                // Call the GetValues method (with or without showing information on the console).
                case ConsoleKey.D:
                    // Finds a valid Endpoint for a Node.
                    endpointAddress = StartDiscoveryProcess(false);
                    if (endpointAddress != null)
                    {
                        // Get Metadata and the endpoint of the service.
                        hostedEndPoint = GetMetaData(endpointAddress);

                        // Check if the invokation of the service will be called again.
                    }
                    // Kill the current processes.
                    if (UsbBridgeProcess != null)
                    {
                        UsbBridgeProcess.Kill();
                    }
                    if (SSimpDevice != null)
                    {
                        SSimpDevice.Kill();
                    }

                    break;

                case ConsoleKey.I:
                    if (hostedEndPoint != null)
                    {
                        //Invoke the service to get the values.
                        InvokeService(hostedEndPoint, false);
                    }
                    break;

                // Make a performance test.
                case ConsoleKey.P:
                    // endpointAddress = StartDiscoveryProcess(false);
                    if (hostedEndPoint != null)
                    {
                        // Get Metadata and the endpoint of the service.
                        //EndpointAddress hostedEndPoint = GetMetaData(endpointAddress);

                        bool runAgainPerformance = true;
                        while (runAgainPerformance)
                        {
                            runAgainPerformance = false;

                            string valueStr = string.Empty;
                            int    quantity = 0;
                            int    timeWait = -1;

                            // Check the quantity of samples to try the performance test.
                            while (!int.TryParse(valueStr, out quantity))
                            {
                                Console.Write("Select the quantity of samples (C-Cancel): ");
                                valueStr = Console.ReadLine();
                                if (valueStr == "C" || valueStr == "c")
                                {
                                    break;
                                }
                            }
                            if (quantity <= 0)
                            {
                                break;
                            }

                            // Get the time to wait between each sample invoke.
                            valueStr = string.Empty;
                            while (!int.TryParse(valueStr, out timeWait))
                            {
                                Console.Write("Select the time to wait between samples in miliseconds (C-Cancel): ");
                                valueStr = Console.ReadLine();
                                if (valueStr == "C" || valueStr == "c")
                                {
                                    break;
                                }
                            }
                            if (timeWait < 0)
                            {
                                break;
                            }

                            Console.Write("Reading Values. This may take some time...");
                            System.Diagnostics.Stopwatch stp1 = new System.Diagnostics.Stopwatch();
                            stp1.Start();
                            for (int i = 0; i < quantity; i++)
                            {
                                // Invoke the service.
                                InvokeService(hostedEndPoint, true);
                                System.Threading.Thread.Sleep(timeWait);
                            }
                            stp1.Stop();
                            Console.WriteLine("done.");
                            Console.WriteLine("Time elapsed: {0}", stp1.ElapsedMilliseconds);

                            // Ask if the user wants to run again.
                            Console.Write("Run again (Y-yes, N-no)?");
                            ConsoleKeyInfo ky = Console.ReadKey();
                            if (ky.Key == ConsoleKey.Y)
                            {
                                runAgainPerformance = true;
                            }
                            Console.WriteLine();
                        }
                    }
                    // Kill the current processes.
                    if (UsbBridgeProcess != null)
                    {
                        UsbBridgeProcess.Kill();
                    }
                    if (SSimpDevice != null)
                    {
                        SSimpDevice.Kill();
                    }

                    break;

                // Initialize the Subcription event.
                case ConsoleKey.S:
                    Console.WriteLine("Starting subscription event...");

                    //  endpointAddress = StartDiscoveryProcess(false);
                    if (hostedEndPoint != null)
                    {
                        //Get Metadata of the address.
                        //  EndpointAddress hostedEndPoint = GetMetaData(endpointAddress);

                        InstanceContext ithis = new InstanceContext(new DiscoveryCallBack());



                        // Create a client
                        using (SensorValuesClient client = new SensorValuesClient(ithis))
                        {
                            client.Endpoint.Address = hostedEndPoint;
                            client.Open();

                            EndpointAddress   callbackEndpoint = client.InnerDuplexChannel.LocalAddress;
                            EventSourceClient eventSource      = new EventSourceClient(ithis, "WSEventing");
                            eventSource.Endpoint.Address = hostedEndPoint;
                            eventSource.Open();

                            Subscribe s = new Subscribe();
                            (s.Delivery = new DeliveryType()).Mode = "http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/Push";

                            XmlDocument doc = new XmlDocument();
                            using (XmlWriter writer = doc.CreateNavigator().AppendChild())
                            {
                                EndpointReferenceType notifyTo = new EndpointReferenceType();

                                (notifyTo.Address = new AttributedURI()).Value = callbackEndpoint.Uri.AbsoluteUri;

                                XmlRootAttribute notifyToElem = new XmlRootAttribute("NotifyTo");
                                notifyToElem.Namespace = "http://schemas.xmlsoap.org/ws/2004/08/eventing";

                                XmlDocument doc2 = new XmlDocument();
                                using (XmlWriter writer2 = doc2.CreateNavigator().AppendChild())
                                {
                                    XmlRootAttribute ReferenceElement = new XmlRootAttribute("ReferenceElement");
                                    foreach (AddressHeader h in callbackEndpoint.Headers)
                                    {
                                        h.WriteAddressHeader(writer2);
                                    }

                                    writer2.Close();
                                    notifyTo.ReferenceParameters     = new ReferenceParametersType();
                                    notifyTo.ReferenceParameters.Any = notifyTo.ReferenceParameters.Any = doc2.ChildNodes.Cast <XmlElement>().ToArray <XmlElement>();
                                }

                                new XmlSerializer(notifyTo.GetType(), notifyToElem).Serialize(writer, notifyTo);
                            }

                            (s.Delivery.Any = new XmlElement[1])[0]       = doc.DocumentElement;
                            (s.Filter = new FilterType()).Dialect         = "http://schemas.xmlsoap.org/ws/2006/02/devprof/Action";
                            (s.Filter.Any = new System.Xml.XmlNode[1])[0] = new System.Xml.XmlDocument().CreateTextNode("http://www.teco.edu/SensorValues/SensorValuesEventOut");

                            SubscribeResponse subscription;
                            try
                            {
                                Console.WriteLine("Subscribing to the event...");
                                //Console.ReadLine();
                                subscription = eventSource.SubscribeOp(s);
                            }
                            catch (TimeoutException t)
                            {
                                Console.WriteLine("Error reply time out: {0}!!", t.Message);
                                hostedEndPoint = null;
                                return;
                            }
                            catch (EndpointNotFoundException e)
                            {
                                return;
                            }

                            String subscriptionId = null;
                            foreach (XmlNode xel in subscription.SubscriptionManager.ReferenceParameters.Any)
                            {
                                if (xel.LocalName.Equals("Identifier") && xel.NamespaceURI.Equals("http://schemas.xmlsoap.org/ws/2004/08/eventing"))
                                {
                                    subscriptionId = xel.InnerText;
                                }
                            }

                            Console.WriteLine("Got subscription: {0}", subscriptionId);

                            Console.WriteLine("Press <ENTER> to unsubscribe.");
                            Console.ReadLine();

                            Console.WriteLine("Unsubscribing {0}", subscriptionId);
                            SubscriptionManagerClient subscriptionManager = new SubscriptionManagerClient("WSEventingUnsubscribe");
                            subscriptionManager.Endpoint.Address = hostedEndPoint;
                            subscriptionManager.UnsubscribeOp(subscriptionId, new Unsubscribe());
                            client.Close();
                        }
                    }

                    break;

                // Close the application.
                case ConsoleKey.E:
                    return;

                // Invalid key.
                default:
                    Console.WriteLine("Invalid value.");
                    break;
                }
            }
        }