Skip to content

Commit

Permalink
Modelcompiler updates, errata 1.04.9 nodeset (#1284)
Browse files Browse the repository at this point in the history
- Use updated Modelcompiler code generator to produce code which has no dependency on System.Servicemodel
- breaking change, .NET stack which used the NET_STANDARD version have to fix dependencies on System.Servicemodel
- new codegenerator also provides stubs for async client API (NET_STANDARD_ASYNC), currently disabled
- latest V1.04.9 Nodeset
  • Loading branch information
opcfoundation-org committed Mar 29, 2021
1 parent 2095723 commit 0f97945
Show file tree
Hide file tree
Showing 81 changed files with 40,164 additions and 34,237 deletions.
15 changes: 6 additions & 9 deletions Applications/ReferenceServer/ReferenceNodeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
variables.Add(CreateVariable(staticFolder, scalarStatic + "QualifiedName", "QualifiedName", DataTypeIds.QualifiedName, ValueRanks.Scalar));
variables.Add(CreateVariable(staticFolder, scalarStatic + "SByte", "SByte", DataTypeIds.SByte, ValueRanks.Scalar));
variables.Add(CreateVariable(staticFolder, scalarStatic + "String", "String", DataTypeIds.String, ValueRanks.Scalar));
variables.Add(CreateVariable(staticFolder, scalarStatic + "Time", "Time", DataTypeIds.Time, ValueRanks.Scalar));
variables.Add(CreateVariable(staticFolder, scalarStatic + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.Scalar));
variables.Add(CreateVariable(staticFolder, scalarStatic + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.Scalar));
variables.Add(CreateVariable(staticFolder, scalarStatic + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.Scalar));
Expand Down Expand Up @@ -293,7 +292,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
"龙_ 绵羊 大象 芒果; 猫'" };
variables.Add(stringArrayVar);

variables.Add(CreateVariable(arraysFolder, staticArrays + "Time", "Time", DataTypeIds.Time, ValueRanks.OneDimension));
variables.Add(CreateVariable(arraysFolder, staticArrays + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.OneDimension));
variables.Add(CreateVariable(arraysFolder, staticArrays + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.OneDimension));
variables.Add(CreateVariable(arraysFolder, staticArrays + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.OneDimension));
Expand Down Expand Up @@ -325,7 +323,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + "QualifiedName", "QualifiedName", DataTypeIds.QualifiedName, ValueRanks.TwoDimensions));
variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + "SByte", "SByte", DataTypeIds.SByte, ValueRanks.TwoDimensions));
variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + "String", "String", DataTypeIds.String, ValueRanks.TwoDimensions));
variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + "Time", "Time", DataTypeIds.Time, ValueRanks.TwoDimensions));
variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.TwoDimensions));
variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.TwoDimensions));
variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.TwoDimensions));
Expand Down Expand Up @@ -357,7 +354,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
variables.Add(CreateVariable(arrayDymnamicFolder, staticArraysDynamic + "QualifiedName", "QualifiedName", DataTypeIds.QualifiedName, ValueRanks.OneOrMoreDimensions));
variables.Add(CreateVariable(arrayDymnamicFolder, staticArraysDynamic + "SByte", "SByte", DataTypeIds.SByte, ValueRanks.OneOrMoreDimensions));
variables.Add(CreateVariable(arrayDymnamicFolder, staticArraysDynamic + "String", "String", DataTypeIds.String, ValueRanks.OneOrMoreDimensions));
variables.Add(CreateVariable(arrayDymnamicFolder, staticArraysDynamic + "Time", "Time", DataTypeIds.Time, ValueRanks.OneOrMoreDimensions));
variables.Add(CreateVariable(arrayDymnamicFolder, staticArraysDynamic + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.OneOrMoreDimensions));
variables.Add(CreateVariable(arrayDymnamicFolder, staticArraysDynamic + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.OneOrMoreDimensions));
variables.Add(CreateVariable(arrayDymnamicFolder, staticArraysDynamic + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.OneOrMoreDimensions));
Expand Down Expand Up @@ -388,7 +384,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
variables.AddRange(CreateVariables(massFolder, staticMass + "Number", "Number", DataTypeIds.Number, ValueRanks.Scalar, 100));
variables.AddRange(CreateVariables(massFolder, staticMass + "SByte", "SByte", DataTypeIds.SByte, ValueRanks.Scalar, 100));
variables.AddRange(CreateVariables(massFolder, staticMass + "String", "String", DataTypeIds.String, ValueRanks.Scalar, 100));
variables.AddRange(CreateVariables(massFolder, staticMass + "Time", "Time", DataTypeIds.Time, ValueRanks.Scalar, 100));
variables.AddRange(CreateVariables(massFolder, staticMass + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.Scalar, 100));
variables.AddRange(CreateVariables(massFolder, staticMass + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.Scalar, 100));
variables.AddRange(CreateVariables(massFolder, staticMass + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.Scalar, 100));
Expand Down Expand Up @@ -420,7 +415,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
CreateDynamicVariable(simulationFolder, scalarSimulation + "QualifiedName", "QualifiedName", DataTypeIds.QualifiedName, ValueRanks.Scalar);
CreateDynamicVariable(simulationFolder, scalarSimulation + "SByte", "SByte", DataTypeIds.SByte, ValueRanks.Scalar);
CreateDynamicVariable(simulationFolder, scalarSimulation + "String", "String", DataTypeIds.String, ValueRanks.Scalar);
CreateDynamicVariable(simulationFolder, scalarSimulation + "Time", "Time", DataTypeIds.Time, ValueRanks.Scalar);
CreateDynamicVariable(simulationFolder, scalarSimulation + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.Scalar);
CreateDynamicVariable(simulationFolder, scalarSimulation + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.Scalar);
CreateDynamicVariable(simulationFolder, scalarSimulation + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.Scalar);
Expand Down Expand Up @@ -460,7 +454,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
CreateDynamicVariable(arraysSimulationFolder, simulationArrays + "QualifiedName", "QualifiedName", DataTypeIds.QualifiedName, ValueRanks.OneDimension);
CreateDynamicVariable(arraysSimulationFolder, simulationArrays + "SByte", "SByte", DataTypeIds.SByte, ValueRanks.OneDimension);
CreateDynamicVariable(arraysSimulationFolder, simulationArrays + "String", "String", DataTypeIds.String, ValueRanks.OneDimension);
CreateDynamicVariable(arraysSimulationFolder, simulationArrays + "Time", "Time", DataTypeIds.Time, ValueRanks.OneDimension);
CreateDynamicVariable(arraysSimulationFolder, simulationArrays + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.OneDimension);
CreateDynamicVariable(arraysSimulationFolder, simulationArrays + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.OneDimension);
CreateDynamicVariable(arraysSimulationFolder, simulationArrays + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.OneDimension);
Expand Down Expand Up @@ -492,7 +485,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
CreateDynamicVariables(massSimulationFolder, massSimulation + "QualifiedName", "QualifiedName", DataTypeIds.QualifiedName, ValueRanks.Scalar, 100);
CreateDynamicVariables(massSimulationFolder, massSimulation + "SByte", "SByte", DataTypeIds.SByte, ValueRanks.Scalar, 100);
CreateDynamicVariables(massSimulationFolder, massSimulation + "String", "String", DataTypeIds.String, ValueRanks.Scalar, 100);
CreateDynamicVariables(massSimulationFolder, massSimulation + "Time", "Time", DataTypeIds.Time, ValueRanks.Scalar, 100);
CreateDynamicVariables(massSimulationFolder, massSimulation + "UInt16", "UInt16", DataTypeIds.UInt16, ValueRanks.Scalar, 100);
CreateDynamicVariables(massSimulationFolder, massSimulation + "UInt32", "UInt32", DataTypeIds.UInt32, ValueRanks.Scalar, 100);
CreateDynamicVariables(massSimulationFolder, massSimulation + "UInt64", "UInt64", DataTypeIds.UInt64, ValueRanks.Scalar, 100);
Expand Down Expand Up @@ -546,6 +538,12 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
item.EURange.Value.High = 0;
item.EURange.Value.Low = 0;
}

//set default value for Definition property
if (item.Definition != null)
{
item.Definition.Value = String.Empty;
}
}
}
#endregion
Expand Down Expand Up @@ -573,7 +571,6 @@ public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> e
CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + "QualifiedName", "QualifiedName", BuiltInType.QualifiedName, ValueRanks.OneDimension, new QualifiedName[] { "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9"});
CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + "SByte", "SByte", BuiltInType.SByte, ValueRanks.OneDimension, new SByte[] { 10, 20, 30, 40, 50, 60, 70, 80, 90 });
CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + "String", "String", BuiltInType.String, ValueRanks.OneDimension, new String[] { "a00", "b10", "c20", "d30", "e40", "f50", "g60", "h70", "i80", "j90" });
CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + "Time", "Time", DataTypeIds.Time, ValueRanks.OneDimension, new String[] { DateTime.MinValue.ToString(), DateTime.MaxValue.ToString(), DateTime.MinValue.ToString(), DateTime.MaxValue.ToString(), DateTime.MinValue.ToString(), DateTime.MaxValue.ToString(), DateTime.MinValue.ToString(), DateTime.MaxValue.ToString(), DateTime.MinValue.ToString(), DateTime.MaxValue.ToString() }, null);
CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + "UInt16", "UInt16", BuiltInType.UInt16, ValueRanks.OneDimension, new UInt16[] { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 });
CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + "UInt32", "UInt32", BuiltInType.UInt32, ValueRanks.OneDimension, new UInt32[] { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 });
CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + "UInt64", "UInt64", BuiltInType.UInt64, ValueRanks.OneDimension, new UInt64[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });
Expand Down
1 change: 0 additions & 1 deletion Libraries/Opc.Ua.Client/Browser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace Opc.Ua.Client
Expand Down
3 changes: 1 addition & 2 deletions Libraries/Opc.Ua.Client/SessionReconnectHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,7 @@ private async Task<bool> DoReconnect()
(sre.StatusCode == StatusCodes.BadTcpInternalError ||
sre.StatusCode == StatusCodes.BadCommunicationError ||
sre.StatusCode == StatusCodes.BadNotConnected ||
sre.StatusCode == StatusCodes.BadTimeout)) ||
exception is System.ServiceModel.EndpointNotFoundException)
sre.StatusCode == StatusCodes.BadTimeout)))
{
// check if reconnecting is still an option.
if (m_session.LastKeepAliveTime.AddMilliseconds(m_session.SessionTimeout) > DateTime.UtcNow)
Expand Down
1 change: 0 additions & 1 deletion Libraries/Opc.Ua.Server/Server/IServerInternal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
using System.Security.Principal;
using System.Security.Cryptography.X509Certificates;
Expand Down
42 changes: 34 additions & 8 deletions Stack/Opc.Ua.Bindings.Https/Stack/Https/HttpsTransportChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using System.Net.Http;
using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;

namespace Opc.Ua.Bindings
Expand Down Expand Up @@ -55,7 +56,11 @@ public void Dispose()
public string UriScheme => Utils.UriSchemeHttps;

/// <inheritdoc/>
public TransportChannelFeatures SupportedFeatures => TransportChannelFeatures.Open | TransportChannelFeatures.Reconnect | TransportChannelFeatures.BeginSendRequest;
public TransportChannelFeatures SupportedFeatures =>
TransportChannelFeatures.Open |
TransportChannelFeatures.Reconnect |
TransportChannelFeatures.BeginSendRequest |
TransportChannelFeatures.SendRequestAsync;

/// <inheritdoc/>
public EndpointDescription EndpointDescription => m_settings.Description;
Expand Down Expand Up @@ -162,12 +167,12 @@ public void Close()
/// <summary>
/// The async result class for the Https transport.
/// </summary>
private class AsyncResult : AsyncResultBase
private class HttpsAsyncResult : AsyncResultBase
{
public IServiceRequest Request;
public HttpResponseMessage Response;

public AsyncResult(
public HttpsAsyncResult(
AsyncCallback callback,
object callbackData,
int timeout,
Expand All @@ -189,13 +194,14 @@ public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback call
try
{
ByteArrayContent content = new ByteArrayContent(BinaryEncoder.EncodeMessage(request, m_quotas.MessageContext));
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
content.Headers.ContentType = m_mediaTypeHeaderValue;

AsyncResult result = new AsyncResult(callback, callbackData, m_operationTimeout, request, null);
var result = new HttpsAsyncResult(callback, callbackData, m_operationTimeout, request, null);
Task.Run(async () => {
try
{
response = await m_client.PostAsync(m_url, content);
var ct = new CancellationTokenSource(m_operationTimeout).Token;
response = await m_client.PostAsync(m_url, content, ct);
response.EnsureSuccessStatusCode();
}
catch (Exception ex)
Expand All @@ -213,7 +219,7 @@ public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback call
catch (Exception ex)
{
Utils.Trace("Exception sending HTTPS request: " + ex.Message);
AsyncResult result = new AsyncResult(callback, callbackData, m_operationTimeout, request, response);
HttpsAsyncResult result = new HttpsAsyncResult(callback, callbackData, m_operationTimeout, request, response);
result.Exception = ex;
result.OperationCompleted();
return result;
Expand All @@ -223,7 +229,7 @@ public IAsyncResult BeginSendRequest(IServiceRequest request, AsyncCallback call
/// <inheritdoc/>
public IServiceResponse EndSendRequest(IAsyncResult result)
{
AsyncResult result2 = result as AsyncResult;
HttpsAsyncResult result2 = result as HttpsAsyncResult;
if (result2 == null)
{
throw new ArgumentException("Invalid result object passed.", nameof(result));
Expand Down Expand Up @@ -309,6 +315,25 @@ public IServiceResponse SendRequest(IServiceRequest request)
return EndSendRequest(result);
}

/// <inheritdoc/>
public async Task<IServiceResponse> SendRequestAsync(IServiceRequest request, CancellationToken ct)
{
try
{
ByteArrayContent content = new ByteArrayContent(BinaryEncoder.EncodeMessage(request, m_quotas.MessageContext));
content.Headers.ContentType = m_mediaTypeHeaderValue;
var result = await m_client.PostAsync(m_url, content, ct);
result.EnsureSuccessStatusCode();
Stream responseContent = await result.Content.ReadAsStreamAsync();
return BinaryDecoder.DecodeMessage(responseContent, null, m_quotas.MessageContext) as IServiceResponse;
}
catch (Exception ex)
{
Utils.Trace("Exception sending HTTPS request: " + ex.Message);
throw;
}
}

/// <summary>
/// Save the settings for a connection.
/// </summary>
Expand Down Expand Up @@ -347,6 +372,7 @@ private void SaveSettings(Uri url, TransportChannelSettings settings)
private TransportChannelSettings m_settings;
private ChannelQuotas m_quotas;
private HttpClient m_client;
private static readonly MediaTypeHeaderValue m_mediaTypeHeaderValue = new MediaTypeHeaderValue("application/octet-stream");
}
}

4 changes: 1 addition & 3 deletions Stack/Opc.Ua.Core/Opc.Ua.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -39,22 +39,20 @@

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="System.Buffers" Version="4.5.1" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<Reference Include="System.Security" />
<Reference Include="System.ServiceModel" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="System.Data.Common" Version="4.3.0" />
<PackageReference Include="System.ServiceModel.Primitives" Version="4.8.1" />
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.1'">
<PackageReference Include="System.Data.Common" Version="4.3.0" />
<PackageReference Include="System.ServiceModel.Primitives" Version="4.8.1" />
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
</ItemGroup>

Expand Down

0 comments on commit 0f97945

Please sign in to comment.