-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
176 lines (145 loc) · 7.04 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
using AdminShell;
using Newtonsoft.Json;
using Opc.Ua;
using Opc.Ua.Configuration;
using System.Xml;
using System.Xml.Serialization;
namespace AAS2Nodeset
{
class Program
{
public static AssetAdministrationShellEnvironment? g_AASEnv;
static void Main(string[] args)
{
// read XML AAS models
Dictionary<string, string> xmlModels = RetrieveModelsFromDirectory("*.xml");
Console.WriteLine();
// parse XML AAS models
foreach (KeyValuePair<string, string> xmlModel in xmlModels)
{
try
{
Console.WriteLine("Processing " + xmlModel.Key + "...");
string nsURI = TryReadXmlFirstElementNamespaceURI(xmlModel.Value);
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Document;
XmlReader reader = XmlReader.Create(new StringReader(xmlModel.Value), settings);
// read V1.0
if (nsURI != null && nsURI.Trim() == "http://www.admin-shell.io/aas/1/0")
{
XmlSerializer serializer = new XmlSerializer(typeof(AssetAdministrationShellEnvironment), "http://www.admin-shell.io/aas/1/0");
g_AASEnv = serializer.Deserialize(reader) as AssetAdministrationShellEnvironment;
}
// read V2.0
if (nsURI != null && nsURI.Trim() == "http://www.admin-shell.io/aas/2/0")
{
XmlSerializer serializer = new XmlSerializer(typeof(AssetAdministrationShellEnvironment), "http://www.admin-shell.io/aas/2/0");
g_AASEnv = serializer.Deserialize(reader) as AssetAdministrationShellEnvironment;
}
// read V3.0
if (nsURI != null && nsURI.Trim() == "http://www.admin-shell.io/aas/3/0")
{
XmlSerializer serializer = new XmlSerializer(typeof(AssetAdministrationShellEnvironment), "http://www.admin-shell.io/aas/3/0");
g_AASEnv = serializer.Deserialize(reader) as AssetAdministrationShellEnvironment;
}
reader.Close();
ExportNodeset();
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}, skipping this model!");
Console.WriteLine();
}
}
// read JSON AAS models
Dictionary<string, string> jsonModels = RetrieveModelsFromDirectory("*.json");
Console.WriteLine();
// parse JSON AAS models
foreach (KeyValuePair<string, string> jsonModel in jsonModels)
{
try
{
Console.WriteLine("Processing " + jsonModel.Key + "...");
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
g_AASEnv = JsonConvert.DeserializeObject<AssetAdministrationShellEnvironment>(jsonModel.Value, settings);
ExportNodeset();
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}, skipping this model!");
Console.WriteLine();
}
}
}
private static void ExportNodeset()
{
if ((g_AASEnv != null) && (g_AASEnv.Submodels.Count > 0))
{
// convert to NodeSet2 by starting an OPC UA server, converting the AAS Environment according to I4AAS spec and exporting the server's address space
ApplicationInstance app = new();
ApplicationConfiguration config = app.LoadApplicationConfiguration(Path.Combine(Directory.GetCurrentDirectory(), "Application.Config.xml"), false).GetAwaiter().GetResult();
app.CheckApplicationInstanceCertificate(false, 0);
// create OPC UA cert validator
app.ApplicationConfiguration.CertificateValidator = new CertificateValidator();
app.ApplicationConfiguration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidationCallback);
app.ApplicationConfiguration.CertificateValidator.Update(app.ApplicationConfiguration.SecurityConfiguration).GetAwaiter().GetResult();
app.Start(new SimpleServer());
app.Stop();
}
}
private static Dictionary<string, string> RetrieveModelsFromDirectory(string searchPattern)
{
Dictionary<string, string> models = new();
EnumerationOptions options = new()
{
RecurseSubdirectories = true
};
string? modelPath = Environment.GetEnvironmentVariable("MODEL_PATH");
if (modelPath == null || !Path.IsPathFullyQualified(modelPath))
{
// use application directory instead
modelPath = Directory.GetCurrentDirectory();
}
foreach (string filePath in Directory.EnumerateFiles(modelPath, searchPattern, options))
{
Console.WriteLine($"Found model: {filePath}");
string modelDefinition = System.IO.File.ReadAllText(filePath);
models.Add(filePath, modelDefinition);
}
return models;
}
private static string TryReadXmlFirstElementNamespaceURI(string model)
{
string nsURI = string.Empty;
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Document;
XmlReader reader = XmlReader.Create(new StringReader(model), settings);
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
nsURI = reader.NamespaceURI;
break;
}
}
reader.Close();
}
catch (Exception)
{
// do nothing
}
return nsURI;
}
private static void CertificateValidationCallback(CertificateValidator sender, CertificateValidationEventArgs e)
{
// always trust the OPC UA certificate
if (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted)
{
e.Accept = true;
}
}
}
}