public OpcUaClient GetClient(DatasourceRequest request, OpcUaJsonData jsonData)
        {
            OpcUaClient client = null;

            try
            {
                client = clientConnections[request.Datasource.Url];
            }
            catch (System.Collections.Generic.KeyNotFoundException)
            {
                Task <OpcUaClient> connectTask;
                if (jsonData.tlsAuth)
                {
                    connectTask = ConnectAsync(request.Datasource.Url, request.Datasource.DecryptedSecureJsonData["tlsClientCert"], request.Datasource.DecryptedSecureJsonData["tlsClientKey"]);
                }
                else
                {
                    connectTask = ConnectAsync(request.Datasource.Url);
                }

                connectTask.Wait();
                client = connectTask.Result;
                clientConnections[request.Datasource.Url] = client;
            }
            catch (System.NullReferenceException)
            {
                clientConnections = new Dictionary <string, OpcUaClient>();
            }

            return(client);
        }
        public OpcUaJsonData(ByteString base64encoded)
        {
            byte[]        byDecoded = System.Convert.FromBase64String(base64encoded.ToString());
            OpcUaJsonData jsonData  = JsonSerializer.Deserialize <OpcUaJsonData>(byDecoded);

            tlsAuth           = jsonData.tlsAuth;
            tlsAuthWithCACert = jsonData.tlsAuthWithCACert;
            tlsSkipVerify     = jsonData.tlsSkipVerify;
        }
        public async override Task <DatasourceResponse> Query(DatasourceRequest request, ServerCallContext context)
        {
            DatasourceResponse response = new DatasourceResponse {
            };

            try
            {
                log.Information("got a request: {0}", request);
                List <OpcUAQuery> queries  = ParseJSONQueries(request);
                OpcUaJsonData     jsonData = JsonSerializer.Deserialize <OpcUaJsonData>(request.Datasource.JsonData);
                OpcUaClient       client   = GetClient(request, jsonData);
                log.Information("got a client {0}", client);

                // Process the queries
                foreach (OpcUAQuery query in queries)
                {
                    QueryResult queryResult = new QueryResult();
                    queryResult.RefId = query.refId;
                    switch (query.call)
                    {
                    case "Browse":
                    {
                        log.Information("client {0}", client);
                        var results = client.BrowseNodeReference(query.callParams["nodeId"]);
                        BrowseResultsEntry[] browseResults = new BrowseResultsEntry[results.Length];
                        for (int i = 0; i < results.Length; i++)
                        {
                            browseResults[i] = new BrowseResultsEntry(results[i].DisplayName.ToString(), results[i].BrowseName.ToString(), results[i].NodeId.ToString());
                        }
                        var jsonResults = JsonSerializer.Serialize <BrowseResultsEntry[]>(browseResults);
                        queryResult.MetaJson = jsonResults;
                    }
                    break;

                    case "FlatBrowse":
                    {
                        if (this.browseResults == null)
                        {
                            var browseResults = this.FlatBrowse(client);
                            var jsonResults   = JsonSerializer.Serialize <BrowseResultsEntry[]>(browseResults);
                            this.browseResults = jsonResults;
                        }
                        queryResult.MetaJson = this.browseResults;
                    }
                    break;

                    case "ReadNode":
                    {
                        log.Information("ReadNode {0}", query.callParams["nodeId"]);
                        var readResults = client.ReadNode(query.callParams["nodeId"]);
                        log.Information("Results: {0}", readResults);
                        var jsonResults = JsonSerializer.Serialize <DataValue>(readResults);
                        queryResult.MetaJson = jsonResults;
                    }
                    break;

/*                        case "Subscription":
 *                          {
 *                              client.AddSubscription(query.refId, query.callParams["nodeId"], SubCallback);
 *                              queryResult.MetaJson = "";
 *                          }
 *                          break;*/
                    case "ReadDataRaw":
                    {
                        log.Information("Query: {0}", request.TimeRange);
                        DateTime fromTime = DateTimeOffset.FromUnixTimeMilliseconds(request.TimeRange.FromEpochMs).UtcDateTime;
                        DateTime toTime   = DateTimeOffset.FromUnixTimeMilliseconds(request.TimeRange.ToEpochMs).UtcDateTime;
                        log.Information("Parsed Time: {0} {1}", fromTime, toTime);

                        var readResults = client.ReadHistoryRawDataValues(
                            query.callParams["nodeId"],
                            fromTime,
                            toTime,
                            (uint)query.maxDataPoints,
                            false);

                        var jsonResults = JsonSerializer.Serialize <IEnumerable <DataValue> >(readResults);
                        queryResult.MetaJson = jsonResults;
                    }
                    break;

                    case "ReadDataProcessed":
                    {
                        DateTime fromTime    = DateTimeOffset.FromUnixTimeMilliseconds(request.TimeRange.FromEpochMs).UtcDateTime;
                        DateTime toTime      = DateTimeOffset.FromUnixTimeMilliseconds(request.TimeRange.ToEpochMs).UtcDateTime;
                        var      readResults = client.ReadHistoryProcessed(
                            query.callParams["nodeId"],
                            fromTime,
                            toTime,
                            query.callParams["aggregate"],
                            query.intervalMs,
                            (uint)query.maxDataPoints,
                            true);
                        var jsonResults = JsonSerializer.Serialize <IEnumerable <DataValue> >(readResults);
                        log.Information("Results: {0}", readResults);
                        queryResult.MetaJson = jsonResults;
                    }
                    break;
                    }
                    response.Results.Add(queryResult);
                }
            }
            catch (Exception ex)
            {
                // Close out the client connection.
                clientConnections[request.Datasource.Url].Disconnect();
                clientConnections.Remove(request.Datasource.Url);
                log.Information("Error: {0}", ex);
                QueryResult queryResult = new QueryResult();
                queryResult.Error = ex.ToString();
                response.Results.Add(queryResult);
            }

            return(response);
        }