mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-29 07:07:24 +08:00
Merge pull request #222 from OPCFoundation/master
Sync prototyping with master
This commit is contained in:
@@ -284,154 +284,6 @@ namespace Opc.Ua.Client.Controls
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Discovery
|
||||
/// <summary>
|
||||
/// Discovers the servers on the local machine.
|
||||
/// </summary>
|
||||
/// <param name="configuration">The configuration.</param>
|
||||
/// <returns>A list of server urls.</returns>
|
||||
public static IList<string> DiscoverServers(ApplicationConfiguration configuration)
|
||||
{
|
||||
List<string> serverUrls = new List<string>();
|
||||
|
||||
// set a short timeout because this is happening in the drop down event.
|
||||
EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration);
|
||||
endpointConfiguration.OperationTimeout = 5000;
|
||||
|
||||
// Connect to the local discovery server and find the available servers.
|
||||
using (DiscoveryClient client = DiscoveryClient.Create(new Uri("opc.tcp://localhost:4840"), endpointConfiguration))
|
||||
{
|
||||
ApplicationDescriptionCollection servers = client.FindServers(null);
|
||||
|
||||
// populate the drop down list with the discovery URLs for the available servers.
|
||||
for (int ii = 0; ii < servers.Count; ii++)
|
||||
{
|
||||
if (servers[ii].ApplicationType == ApplicationType.DiscoveryServer)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int jj = 0; jj < servers[ii].DiscoveryUrls.Count; jj++)
|
||||
{
|
||||
string discoveryUrl = servers[ii].DiscoveryUrls[jj];
|
||||
|
||||
// Many servers will use the '/discovery' suffix for the discovery endpoint.
|
||||
// The URL without this prefix should be the base URL for the server.
|
||||
if (discoveryUrl.EndsWith("/discovery"))
|
||||
{
|
||||
discoveryUrl = discoveryUrl.Substring(0, discoveryUrl.Length - "/discovery".Length);
|
||||
}
|
||||
|
||||
// ensure duplicates do not get added.
|
||||
if (!serverUrls.Contains(discoveryUrl))
|
||||
{
|
||||
serverUrls.Add(discoveryUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return serverUrls;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds the endpoint that best matches the current settings.
|
||||
/// </summary>
|
||||
/// <param name="discoveryUrl">The discovery URL.</param>
|
||||
/// <param name="useSecurity">if set to <c>true</c> select an endpoint that uses security.</param>
|
||||
/// <returns>The best available endpoint.</returns>
|
||||
public static EndpointDescription SelectEndpoint(string discoveryUrl, bool useSecurity)
|
||||
{
|
||||
// needs to add the '/discovery' back onto non-UA TCP URLs.
|
||||
if (!discoveryUrl.StartsWith(Utils.UriSchemeOpcTcp))
|
||||
{
|
||||
if (!discoveryUrl.EndsWith("/discovery"))
|
||||
{
|
||||
discoveryUrl += "/discovery";
|
||||
}
|
||||
}
|
||||
|
||||
// parse the selected URL.
|
||||
Uri uri = new Uri(discoveryUrl);
|
||||
|
||||
// set a short timeout because this is happening in the drop down event.
|
||||
EndpointConfiguration configuration = EndpointConfiguration.Create();
|
||||
configuration.OperationTimeout = 5000;
|
||||
|
||||
EndpointDescription selectedEndpoint = null;
|
||||
|
||||
// Connect to the server's discovery endpoint and find the available configuration.
|
||||
using (DiscoveryClient client = DiscoveryClient.Create(uri, configuration))
|
||||
{
|
||||
EndpointDescriptionCollection endpoints = client.GetEndpoints(null);
|
||||
|
||||
// select the best endpoint to use based on the selected URL and the UseSecurity checkbox.
|
||||
for (int ii = 0; ii < endpoints.Count; ii++)
|
||||
{
|
||||
EndpointDescription endpoint = endpoints[ii];
|
||||
|
||||
// check for a match on the URL scheme.
|
||||
if (endpoint.EndpointUrl.StartsWith(uri.Scheme))
|
||||
{
|
||||
// check if security was requested.
|
||||
if (useSecurity)
|
||||
{
|
||||
if (endpoint.SecurityMode == MessageSecurityMode.None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (endpoint.SecurityMode != MessageSecurityMode.None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// pick the first available endpoint by default.
|
||||
if (selectedEndpoint == null)
|
||||
{
|
||||
selectedEndpoint = endpoint;
|
||||
}
|
||||
|
||||
// The security level is a relative measure assigned by the server to the
|
||||
// endpoints that it returns. Clients should always pick the highest level
|
||||
// unless they have a reason not too.
|
||||
if (endpoint.SecurityLevel > selectedEndpoint.SecurityLevel)
|
||||
{
|
||||
selectedEndpoint = endpoint;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// pick the first available endpoint by default.
|
||||
if (selectedEndpoint == null && endpoints.Count > 0)
|
||||
{
|
||||
selectedEndpoint = endpoints[0];
|
||||
}
|
||||
}
|
||||
|
||||
// if a server is behind a firewall it may return URLs that are not accessible to the client.
|
||||
// This problem can be avoided by assuming that the domain in the URL used to call
|
||||
// GetEndpoints can be used to access any of the endpoints. This code makes that conversion.
|
||||
// Note that the conversion only makes sense if discovery uses the same protocol as the endpoint.
|
||||
|
||||
Uri endpointUrl = Utils.ParseUri(selectedEndpoint.EndpointUrl);
|
||||
|
||||
if (endpointUrl != null && endpointUrl.Scheme == uri.Scheme)
|
||||
{
|
||||
UriBuilder builder = new UriBuilder(endpointUrl);
|
||||
builder.Host = uri.DnsSafeHost;
|
||||
builder.Port = uri.Port;
|
||||
selectedEndpoint.EndpointUrl = builder.ToString();
|
||||
}
|
||||
|
||||
// return the selected endpoint.
|
||||
return selectedEndpoint;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Browse
|
||||
/// <summary>
|
||||
/// Browses the address space and returns the references found.
|
||||
@@ -938,7 +790,6 @@ namespace Opc.Ua.Client.Controls
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region Type Model Browsing
|
||||
/// <summary>
|
||||
/// Collects the instance declarations for a type.
|
||||
|
||||
@@ -56,6 +56,7 @@ namespace Opc.Ua.Client.Controls
|
||||
private ApplicationConfiguration m_configuration;
|
||||
private Session m_session;
|
||||
private int m_reconnectPeriod = 10;
|
||||
private int m_discoverTimeout = 5000;
|
||||
private SessionReconnectHandler m_reconnectHandler;
|
||||
private CertificateValidationEventHandler m_CertificateValidation;
|
||||
private EventHandler m_ReconnectComplete;
|
||||
@@ -285,7 +286,7 @@ namespace Opc.Ua.Client.Controls
|
||||
}
|
||||
|
||||
// select the best endpoint.
|
||||
EndpointDescription endpointDescription = ClientUtils.SelectEndpoint(serverUrl, UseSecurityCK.Checked);
|
||||
EndpointDescription endpointDescription = CoreClientUtils.SelectEndpoint(serverUrl, UseSecurityCK.Checked, m_discoverTimeout);
|
||||
|
||||
EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(m_configuration);
|
||||
ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);
|
||||
@@ -398,7 +399,7 @@ namespace Opc.Ua.Client.Controls
|
||||
}
|
||||
|
||||
// return the selected endpoint.
|
||||
return ClientUtils.SelectEndpoint(discoveryUrl, UseSecurityCK.Checked);
|
||||
return CoreClientUtils.SelectEndpoint(discoveryUrl, UseSecurityCK.Checked, m_discoverTimeout);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user