/// <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()); }
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; } } } }