Ejemplo n.º 1
0
        /// <summary>
        /// Try to find the physical address of a service using discovery functions.
        /// Uses the http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe message and
        /// http://schemas.xmlsoap.org/ws/2005/04/discovery/Resolve message.
        /// </summary>
        /// <returns>The endpoint of the service, null otherwise.</return>
        public static EndpointAddress[] FindServiceAddress()
        {
            Dictionary <Uri, EndpointAddress> ret = new Dictionary <Uri, EndpointAddress>();

            // Creating DiscoveryClient class.
            DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005));

            ;
            Console.Write("Finding for all services in the network (empty criteria)...");

            FindResponse findResponseX = discoveryClient.Find(new FindCriteria()
            {
                Duration = new TimeSpan(0, 0, 2)
            });

            Console.WriteLine("{0} found.\n", findResponseX.Endpoints.Count);

            // Search for each endpoint found to resolve the address given.
            if (findResponseX.Endpoints.Count > 0)
            {
                foreach (EndpointDiscoveryMetadata meta in findResponseX.Endpoints)
                {
                    if (ret.ContainsKey(meta.Address.Uri))
                    {
                        continue;
                    }

                    // Get all contracts of the endpoints.
                    foreach (System.Xml.XmlQualifiedName type in meta.ContractTypeNames)
                    {
                        // Check if its a valid contract.
                        foreach (System.Xml.XmlQualifiedName name in deviceTypes.Keys)
                        {
                            if (type.Equals(name))
                            {
                                ResolveResponse resolveResponse = discoveryClient.Resolve(new ResolveCriteria(meta.Address));

                                Console.WriteLine("New device found: {0}:{1} at {2}", name.Namespace, name.Name, resolveResponse.EndpointDiscoveryMetadata.ListenUris[0]);
                                edu.teco.DPWS.Device device = (edu.teco.DPWS.Device)Activator.CreateInstance(deviceTypes[name]);
                                device.EndpointAddress = new EndpointAddress(resolveResponse.EndpointDiscoveryMetadata.ListenUris[0]);
                                GetMetaData(device);
                                device.Init();
                                knownDevices.Add(device);
                                ret.Add(meta.Address.Uri, new EndpointAddress(resolveResponse.EndpointDiscoveryMetadata.ListenUris[0]));
                                Console.WriteLine("Service can now be invoked");
                                break;
                            }
                        }
                    }
                }
            }

            return(ret.Values.ToArray());
        }
Ejemplo n.º 2
0
        private static void OnOnlineAnnouncement(object sender, AnnouncementEventArgs e)
        {
            Console.WriteLine("Hello!");
            EndpointDiscoveryMetadata metadata = e.EndpointDiscoveryMetadata;

            // Check if service is SSimpDeviceType which is the Host service used
            foreach (System.Xml.XmlQualifiedName type in metadata.ContractTypeNames)
            {
                foreach (System.Xml.XmlQualifiedName name in deviceTypes.Keys)
                {
                    if (type.Equals(name))
                    {
                        Console.WriteLine("New device found: {0}:{1} at {2}", name.Namespace, name.Name, metadata.ListenUris[0]);
                        edu.teco.DPWS.Device device = (edu.teco.DPWS.Device)Activator.CreateInstance(deviceTypes[name]);
                        device.EndpointAddress = new EndpointAddress(metadata.ListenUris[0]);
                        GetMetaData(device);
                        device.Init();
                        knownDevices.Add(device);
                        Console.WriteLine("Service can now be invoked");
                        break;
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Get all the information about the services in a current address.
        /// Send the http://schemas.xmlsoap.org/ws/2004/09/transfer/Get message and
        /// receive the http://schemas.xmlsoap.org/ws/2004/09/transfer/GetResponse.
        /// </summary>
        /// <param name="device">The device containing the services.</param>
        public static void GetMetaData(edu.teco.DPWS.Device device)
        {
            // Custom binding with TextMessageEncoding and HttpTransport and the specific soap and wsa versions shown here:
            CustomBinding binding = new CustomBinding(
                new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressingAugust2004, Encoding.UTF8),
                new HttpTransportBindingElement());

            // A custom mex client deriving from MetadataExchangeClient. The motivation behind writing the custom client was to get at the ClientVia behavior for the MetadataExchangeClient.
            // Followed the instructions here for this.
            // Gave the physical address in the Via for the custom client and the logical address as the EP address to be put into the ws-addressing To header as:
            MetadataExchangeClient mex         = new MetadataExchangeClient(binding);
            MetadataSet            metadataSet = mex.GetMetadata(device.EndpointAddress);

            // Check for the metadata set size.
            System.Collections.ObjectModel.Collection <MetadataSection> documentCollection = metadataSet.MetadataSections;
            if (documentCollection != null)
            {
                //Get the WSDL from each MetadataSection of the metadata set
                foreach (MetadataSection section in documentCollection)
                {
                    try
                    {
                        if (section.Metadata is System.Xml.XmlElement)
                        {
                            System.Xml.XmlElement element = (System.Xml.XmlElement)section.Metadata;
                            if (element.Name == "wsdp:Relationship")
                            {
                                Relationship relationship = (Relationship)Utils.FromXML(element.OuterXml, typeof(Relationship), string.Empty);

                                foreach (System.Xml.XmlElement innerElement in relationship.Any)
                                {
                                    if (innerElement.Name == "wsdp:Host")
                                    {
                                        HostServiceType host = (HostServiceType)Utils.FromXML(innerElement.OuterXml, typeof(HostServiceType),
                                                                                              string.Empty);
                                    }
                                    else if (innerElement.Name == "wsdp:Hosted")
                                    {
                                        HostServiceType hosted = (HostServiceType)Utils.FromXML(innerElement.OuterXml, typeof(HostServiceType),
                                                                                                "http://schemas.xmlsoap.org/ws/2006/02/devprof", new System.Xml.Serialization.XmlRootAttribute("Hosted"));

                                        if (hosted.EndpointReference != null && hosted.EndpointReference.Length > 0)
                                        {
                                            Console.WriteLine("Service ID: {0}", hosted.ServiceId);

                                            foreach (edu.teco.DPWS.Service service in device.GetServices())
                                            {
                                                if (hosted.ServiceId.Equals(service.GetServiceID()))
                                                {
                                                    service.HostedEndpoint = new EndpointAddress(hosted.EndpointReference[0].Address.Value);
                                                    Console.WriteLine("Found endpoint for {0}", service.GetServiceID());
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            else if (element.Name == "wsdp:ThisModel")
                            {
                                ThisModelType thisModel = (ThisModelType)Utils.FromXML(element.OuterXml, typeof(ThisModelType), string.Empty);
                            }
                            else if (element.Name == "wsdp:ThisDevice")
                            {
                                ThisDeviceType thisDevice = (ThisDeviceType)Utils.FromXML(element.OuterXml, typeof(ThisDeviceType), string.Empty);
                                Console.WriteLine(string.Format("FirmwareVersion: {0}", thisDevice.FirmwareVersion));
                                Console.WriteLine(string.Format("FriendlyName: {0}", thisDevice.FriendlyName));
                                Console.WriteLine(string.Format("SerialNumber: {0}", thisDevice.SerialNumber));
                            }
                        }
                        else if (section.Metadata is System.Web.Services.Description.ServiceDescription)
                        {
                            System.Web.Services.Description.ServiceDescription sd = (System.Web.Services.Description.ServiceDescription)section.Metadata;
                            Console.WriteLine(string.Format("ServiceDescription name: {0}", sd.Name));
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error on getting MetaData.:{0}", ex.Message);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Initial point of the program.
        /// </summary>
        /// <param name="args">Arguments.</param>
        public static void Main(string[] args)
        {
            Init();

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

 * Please, start a gateway before select the options.
   Additionally when using manual discovery the node must be running 
");
            // Go always into the menu, until the user selects to exit.
            while (true)
            {
                int index = 3;
                // Check the option.
                Console.WriteLine("-----------------");
                Console.WriteLine("1. Wait for Announcement");
                Console.WriteLine("2. Discover services");

                Console.WriteLine("-----------------");
                Console.WriteLine("Discovered devices:");
                foreach (edu.teco.DPWS.Device device in knownDevices)
                {
                    Console.WriteLine("{0}. Type {1} {2}:{3} at {4}", index, device.GetType().Name, device.GetDeviceType().Namespace, device.GetDeviceType().Name, device.EndpointAddress);
                    index++;
                }
                Console.WriteLine("-----------------");
                Console.WriteLine("0. Exit");
                Console.WriteLine("-----------------");
                Console.WriteLine();

                string line = Console.ReadLine();

                if (line.Equals("1"))
                {
                    StartAnnouncementProcess();
                }
                else if (line.Equals("2"))
                {
                    StartDiscoveryProcess();
                }
                else if (line.Equals("0"))
                {
                    return;
                }
                else
                {
                    // Switch to Device menu
                    int selection = 0;
                    if (int.TryParse(line, out selection) && selection > 2 && selection <= knownDevices.Count + 2)
                    {
                        bool done = false;
                        Console.WriteLine();
                        edu.teco.DPWS.Device device = knownDevices[selection - 3];
                        while (!done)
                        {
                            Console.WriteLine("-----------------");
                            Console.WriteLine("Current device: {0} {1}:{2} at {3}", device.GetType().Name, device.GetDeviceType().Namespace, device.GetDeviceType().Name, device.EndpointAddress);
                            Console.WriteLine("-----------------");
                            Console.WriteLine("Services:");
                            index = 1;
                            foreach (edu.teco.DPWS.Service service in device.GetServices())
                            {
                                Console.WriteLine("Service name: {0}", service.GetType().Name);
                                Console.WriteLine("Invokable methods:");
                                foreach (MethodInfo method in service.GetInvokableMethods())
                                {
                                    Object[] subAttributes = method.GetCustomAttributes(typeof(edu.teco.DPWS.DPWSInvokeMethod), true);
                                    if (subAttributes.Length < 1)
                                    {
                                        continue;
                                    }

                                    Console.WriteLine("{0}. {1}", index, ((edu.teco.DPWS.DPWSInvokeMethod)subAttributes[0]).Description);
                                    index++;
                                }
                                Console.WriteLine("Subscribable methods:");
                                foreach (MethodInfo method in service.GetSubscribableMethods())
                                {
                                    Object[] subAttributes = method.GetCustomAttributes(typeof(edu.teco.DPWS.DPWSSubscription), true);
                                    if (subAttributes.Length < 1)
                                    {
                                        continue;
                                    }

                                    Console.WriteLine("{0}. {1}", index, ((edu.teco.DPWS.DPWSSubscription)subAttributes[0]).Description);
                                    index++;
                                }

                                Console.WriteLine();
                            }
                            Console.WriteLine("-----------------");
                            Console.WriteLine("0. Return");

                            string deviceLine = Console.ReadLine();

                            if (deviceLine.Equals("0"))
                            {
                                done = true;
                            }
                            else
                            {
                                int serviceSelection = 0;
                                if (int.TryParse(deviceLine, out serviceSelection) && serviceSelection > 0 && serviceSelection < index)
                                {
                                    foreach (edu.teco.DPWS.Service service in device.GetServices())
                                    {
                                        foreach (MethodInfo method in service.GetInvokableMethods())
                                        {
                                            serviceSelection--;
                                            if (serviceSelection == 0)
                                            {
                                                service.InvokeMethod(method);
                                                break;
                                            }
                                        }
                                        if (serviceSelection == 0)
                                        {
                                            break;
                                        }
                                        foreach (MethodInfo method in service.GetSubscribableMethods())
                                        {
                                            serviceSelection--;
                                            if (serviceSelection == 0)
                                            {
                                                service.SubscribeMethod(method);
                                            }
                                        }
                                        if (serviceSelection == 0)
                                        {
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    Console.WriteLine("Invalid input");
                                }
                            }
                        }
                    }
                    else
                    {
                        Console.WriteLine("Invalid input");
                    }
                }
            }
        }