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;
                    }
                }
            }
        }