/// <summary> /// Test model browse encoder to file /// </summary> private static async Task TestOpcUaModelExportToFileAsync(EndpointModel endpoint) { using (var logger = StackLogger.Create(ConsoleLogger.Create())) { // Run both encodings twice to prime server and get realistic timings the // second time around var runs = new Dictionary <string, string> { ["json1.zip"] = ContentMimeType.UaJson, // ["bin1.zip"] = ContentEncodings.MimeTypeUaBinary, ["json2.zip"] = ContentMimeType.UaJson, // ["bin2.zip"] = ContentEncodings.MimeTypeUaBinary, ["json1.gzip"] = ContentMimeType.UaJson, // ["bin1.gzip"] = ContentEncodings.MimeTypeUaBinary, ["json2.gzip"] = ContentMimeType.UaJson, // ["bin2.gzip"] = ContentEncodings.MimeTypeUaBinary }; using (var client = new ClientServices(logger.Logger, new TestClientServicesConfig())) using (var server = new ServerWrapper(endpoint, logger)) { foreach (var run in runs) { var zip = Path.GetExtension(run.Key) == ".zip"; Console.WriteLine($"Writing {run.Key}..."); var sw = Stopwatch.StartNew(); using (var stream = new FileStream(run.Key, FileMode.Create)) { using (var zipped = zip ? new DeflateStream(stream, CompressionLevel.Optimal) : (Stream) new GZipStream(stream, CompressionLevel.Optimal)) using (var browser = new BrowseStreamEncoder(client, endpoint, zipped, run.Value, null, logger.Logger, null)) { await browser.EncodeAsync(CancellationToken.None); } } var elapsed = sw.Elapsed; using (var file = File.Open(run.Key, FileMode.OpenOrCreate)) { Console.WriteLine($"Encode as {run.Value} to {run.Key} took " + $"{elapsed}, and produced {file.Length} bytes."); } } } } }
/// <summary> /// Test model export and import /// </summary> private static async Task TestOpcUaModelWriterAsync(EndpointModel endpoint) { using (var logger = StackLogger.Create(ConsoleLogger.Create())) { var filename = "model.zip"; using (var server = new ServerWrapper(endpoint, logger)) { using (var client = new ClientServices(logger.Logger, new TestClientServicesConfig())) { Console.WriteLine($"Reading into {filename}..."); using (var stream = new FileStream(filename, FileMode.Create)) { using (var zipped = new DeflateStream(stream, CompressionLevel.Optimal)) using (var browser = new BrowseStreamEncoder(client, endpoint, zipped, ContentMimeType.UaJson, null, logger.Logger, null)) { await browser.EncodeAsync(CancellationToken.None); } } } } GC.Collect(); GC.WaitForPendingFinalizers(); var serializer = new NewtonSoftJsonSerializer(); IDatabaseServer database = new MemoryDatabase(logger.Logger, serializer); for (var i = 0; ; i++) { Console.WriteLine($"{i}: Writing from {filename}..."); var sw = Stopwatch.StartNew(); using (var file = File.Open(filename, FileMode.OpenOrCreate)) { using (var unzipped = new DeflateStream(file, CompressionMode.Decompress)) { // TODO // var writer = new SourceStreamImporter(new ItemContainerFactory(database), // new VariantEncoderFactory(), logger.Logger); // await writer.ImportAsync(unzipped, Path.GetFullPath(filename + i), // ContentMimeType.UaJson, null, CancellationToken.None); } } var elapsed = sw.Elapsed; Console.WriteLine($"{i}: Writing took {elapsed}."); } } }
/// <summary> /// Test model browse encoder /// </summary> private static async Task TestOpcUaModelExportServiceAsync(EndpointModel endpoint) { using (var logger = StackLogger.Create(ConsoleLogger.Create())) using (var client = new ClientServices(logger.Logger, new TestClientServicesConfig())) using (var server = new ServerWrapper(endpoint, logger)) using (var stream = Console.OpenStandardOutput()) using (var writer = new StreamWriter(stream)) using (var json = new JsonTextWriter(writer) { AutoCompleteOnClose = true, Formatting = Formatting.Indented, DateFormatHandling = DateFormatHandling.IsoDateFormat }) using (var encoder = new JsonEncoderEx(json, null, JsonEncoderEx.JsonEncoding.Array) { IgnoreDefaultValues = true, UseAdvancedEncoding = true }) using (var browser = new BrowseStreamEncoder(client, endpoint, encoder, null, logger.Logger, null)) { await browser.EncodeAsync(CancellationToken.None); } }
/// <inheritdoc/> public async Task SendEventAsync(byte[] data, string contentType, string eventSchema, string contentEncoding) { var ev = JsonConvert.DeserializeObject <DiscoveryEventModel>( Encoding.UTF8.GetString(data)); var endpoint = ev.Registration?.Endpoint; if (endpoint == null) { return; } try { var id = endpoint.Url.ToSha1Hash(); _logger.Information("Writing {id}.json for {@ev}", id, ev); using (var writer = File.CreateText($"iop_{id}.json")) using (var json = new JsonTextWriter(writer) { AutoCompleteOnClose = true, Formatting = Formatting.Indented, DateFormatHandling = DateFormatHandling.IsoDateFormat }) using (var encoder = new JsonEncoderEx(json, null, JsonEncoderEx.JsonEncoding.Array) { IgnoreDefaultValues = true, UseAdvancedEncoding = true }) using (var browser = new BrowseStreamEncoder(_client, endpoint, encoder, null, _logger, null)) { await browser.EncodeAsync(CancellationToken.None); } } catch (Exception ex) { _logger.Error(ex, "Failed to browse"); } }