Ejemplo n.º 1
0
        public ActionResult Index()
        {
            OpcSessionModel sessionModel = new OpcSessionModel();

            sessionModel.supervisorList = GetSupervisors();
            return(View("Index", sessionModel));
        }
        public ActionResult Disconnect()
        {
            try
            {
                OpcSessionHelper.Instance.Disconnect(HttpContext.Session.Id);
                HttpContext.Session.SetString("EndpointUrl", string.Empty);
            }
            catch (Exception ex)
            {
                Trace.TraceError(ex.Message);
            }

            if (_application.Server != null)
            {
                _application.Stop();
            }

            UpdateStatus("Disconnected");

            OpcSessionModel sessionModel = new OpcSessionModel
            {
                SessionId  = HttpContext.Session.Id,
                NodesetIDs = new SelectList(new List <string>())
            };

            return(View("Index", sessionModel));
        }
        public async Task <ActionResult> CloudLibrayFileOpen(string nodesetfile)
        {
            OpcSessionModel sessionModel = new OpcSessionModel
            {
                ServerIP   = "localhost",
                ServerPort = "4840",
            };

            string address = _client.BaseAddress + "infomodel/download/" + Uri.EscapeDataString(_namesInCloudLibrary[nodesetfile]);
            HttpResponseMessage response     = _client.Send(new HttpRequestMessage(HttpMethod.Get, address));
            AddressSpace        addressSpace = JsonConvert.DeserializeObject <AddressSpace>(await response.Content.ReadAsStringAsync().ConfigureAwait(false));

            // store the file on the webserver
            string filePath = Path.Combine(Directory.GetCurrentDirectory(), "NodeSets", "nodeset2.xml");

            System.IO.File.WriteAllText(filePath, addressSpace.Nodeset.NodesetXml);
            _nodeSetFilenames.Add(filePath);

            string error = ValidateNamespacesAndModels(true);

            if (!string.IsNullOrEmpty(error))
            {
                sessionModel.ErrorMessage = error;
                return(View("Error", sessionModel));
            }

            await StartClientAndServer(sessionModel).ConfigureAwait(false);

            return(View("Browse", sessionModel));
        }
        public ActionResult Disconnect(FormCollection form, string backUrl)
        {
            try
            {
                OpcSessionHelper.Instance.Disconnect(Session.SessionID);
                Session["EndpointUrl"] = "";
            }
            catch (Exception exception)
            {
                // Trace an error and return to the connect view.
                var errorMessage = string.Format(Strings.BrowserDisconnectException, exception.Message,
                                                 exception.InnerException?.Message ?? "--", exception?.StackTrace ?? "--");
                Trace.TraceError(errorMessage);
            }

            if (OpcSessionHelper.Instance.InitResult != "Good")
            {
                return(RedirectToAction("Index", "Dashboard"));
            }
            else
            {
                if ((backUrl != null) && (backUrl.Contains("AddOpcServer")))
                {
                    return(RedirectToAction("Index", "AddOpcServer"));
                }
                else
                {
                    OpcSessionModel sessionModel = new OpcSessionModel();
                    sessionModel.PrepopulatedEndpoints = new SelectList(_prepopulatedEndpoints, "Value", "Text");
                    return(View("Index", sessionModel));
                }
            }
        }
        public ActionResult Start(string supervisorId)
        {
            OpcSessionModel sessionModel = new OpcSessionModel();

            Session["supervisorId"] = supervisorId;
            return(Index());
        }
        public async Task <ActionResult> Activate(string endpointId)
        {
            OpcSessionModel sessionModel = new OpcSessionModel {
                EndpointId = endpointId
            };

            try
            {
                await RegistryService.ActivateEndpointAsync(endpointId);
            }
            catch (Exception exception)
            {
                // Generate an error to be shown in the error view and trace    .
                string errorMessageTrace = string.Format(Strings.BrowserConnectException, exception.Message,
                                                         exception.InnerException?.Message ?? "--", exception?.StackTrace ?? "--");
                Trace.TraceError(errorMessageTrace);
                if (exception.Message.Contains("ResourceNotFound"))
                {
                    sessionModel.ErrorHeader = Strings.BrowserEndpointErrorHeader;
                }
                else
                {
                    sessionModel.ErrorHeader = Strings.BrowserConnectErrorHeader;
                }
                return(Json(sessionModel));
            }

            Session["EndpointId"] = endpointId;
            return(Json(sessionModel));
        }
        public async Task <ActionResult> ConnectWithTrust(string endpointURL)
        {
            OpcSessionModel sessionModel = new OpcSessionModel {
                EndpointUrl = endpointURL
            };

            // Check that there is a session already in our cache data
            OpcSessionCacheData entry;

            if (OpcSessionHelper.Instance.OpcSessionCache.TryGetValue(Session.SessionID, out entry))
            {
                if (string.Equals(entry.EndpointURL, endpointURL, StringComparison.InvariantCultureIgnoreCase))
                {
                    OpcSessionCacheData newValue = new OpcSessionCacheData
                    {
                        CertThumbprint = entry.CertThumbprint,
                        OPCSession     = entry.OPCSession,
                        EndpointURL    = entry.EndpointURL,
                        Trusted        = true
                    };
                    OpcSessionHelper.Instance.OpcSessionCache.TryUpdate(Session.SessionID, newValue, entry);

                    return(await Connect(endpointURL));
                }
            }

            // Generate an error to be shown in the error view.
            // Since we should only get here when folks are trying to hack the site,
            // make the error generic so not to reveal too much about the internal workings of the site.
            Trace.TraceError(Strings.BrowserConnectErrorHeader);
            sessionModel.ErrorHeader = Strings.BrowserConnectErrorHeader;

            return(Json(sessionModel));
        }
        public async Task <ActionResult> Connect(string endpointUrl)
        {
            OpcSessionModel sessionModel = new OpcSessionModel {
                EndpointUrl = endpointUrl
            };

            Session session = null;

            try
            {
                session = await OpcSessionHelper.Instance.GetSessionAsync(Session.SessionID, endpointUrl);
            }
            catch (Exception exception)
            {
                // Check for untrusted certificate
                ServiceResultException ex = exception as ServiceResultException;
                if ((ex != null) && (ex.InnerResult != null) && (ex.InnerResult.StatusCode == StatusCodes.BadCertificateUntrusted))
                {
                    sessionModel.ErrorHeader = Strings.UntrustedCertificate;
                    return(Json(sessionModel));
                }

                // Generate an error to be shown in the error view and trace.
                string errorMessageTrace = string.Format(Strings.BrowserConnectException, exception.Message,
                                                         exception.InnerException?.Message ?? "--", exception?.StackTrace ?? "--");
                Trace.TraceError(errorMessageTrace);
                sessionModel.ErrorHeader = Strings.BrowserConnectErrorHeader;

                return(Json(sessionModel));
            }

            Session["EndpointUrl"] = endpointUrl;

            return(View("Browse", sessionModel));
        }
Ejemplo n.º 9
0
        public ActionResult UpdateModel()
        {
            OpcSessionModel sessionModel = new OpcSessionModel();

            sessionModel.supervisorList = GetSupervisors();
            ModelState.Clear();
            return(PartialView("_SupervisorList", sessionModel));
        }
        public async Task <ActionResult> LocalFileOpen(IFormFile[] files, bool autodownloadreferences)
        {
            OpcSessionModel sessionModel = new OpcSessionModel
            {
                ServerIP   = "localhost",
                ServerPort = "4840",
            };

            try
            {
                if ((files == null) || (files.Length == 0))
                {
                    throw new ArgumentException("No files specified!");
                }

                _nodeSetFilenames.Clear();
                foreach (IFormFile file in files)
                {
                    if ((file.Length == 0) || (file.ContentType != "text/xml"))
                    {
                        throw new ArgumentException("Invalid file specified!");
                    }

                    // file name validation
                    new FileInfo(file.FileName);

                    // store the file on the webserver
                    string filePath = Path.Combine(Directory.GetCurrentDirectory(), "NodeSets", file.FileName);
                    using (FileStream stream = new FileStream(filePath, FileMode.Create))
                    {
                        await file.CopyToAsync(stream).ConfigureAwait(false);
                    }

                    _nodeSetFilenames.Add(filePath);
                }

                string error = ValidateNamespacesAndModels(autodownloadreferences);
                if (!string.IsNullOrEmpty(error))
                {
                    sessionModel.ErrorMessage = error;
                    return(View("Error", sessionModel));
                }

                await StartClientAndServer(sessionModel).ConfigureAwait(false);

                return(View("Browse", sessionModel));
            }
            catch (Exception ex)
            {
                Trace.TraceError(ex.Message);

                sessionModel.ErrorMessage = ex.Message;
                UpdateStatus($"Error Occured: {sessionModel.ErrorMessage}");

                return(View("Error", sessionModel));
            }
        }
        public ActionResult Error(string errorMessage)
        {
            OpcSessionModel sessionModel = new OpcSessionModel
            {
                ErrorHeader  = Strings.BrowserOpcErrorHeader,
                EndpointUrl  = (string)Session["EndpointUrl"],
                ErrorMessage = HttpUtility.HtmlDecode(errorMessage)
            };

            return(Json(sessionModel));
        }
        public ActionResult BrowseNodes(string endpointId, string endpointUrl, string productUri)
        {
            OpcSessionModel sessionModel = new OpcSessionModel {
                EndpointUrl = endpointUrl, EndpointId = endpointId
            };

            Session["EndpointId"]  = endpointId;
            Session["EndpointUrl"] = endpointUrl;
            Session["ProductUri"]  = productUri;
            return(View("Browse", sessionModel));
        }
        public ActionResult Index()
        {
            OpcSessionModel sessionModel = new OpcSessionModel();

            if (Session["EndpointId"] != null)
            {
                return(View("Browse", sessionModel));
            }

            sessionModel.endpointList = CreateEndpointList();
            return(View("Index", sessionModel));
        }
        public ActionResult Error(string errorMessage)
        {
            OpcSessionModel sessionModel = new OpcSessionModel
            {
                ErrorMessage = HttpUtility.HtmlDecode(errorMessage),
                NodesetIDs   = new SelectList(new List <string>())
            };

            UpdateStatus($"Error Occured: {sessionModel.ErrorMessage}");

            return(View("Error", sessionModel));
        }
        public ActionResult Login(string instanceUrl, string clientId, string secret)
        {
            OpcSessionModel sessionModel = new OpcSessionModel
            {
                SessionId  = HttpContext.Session.Id,
                NodesetIDs = new SelectList(new List <string>())
            };

            _client.DefaultRequestHeaders.Remove("Authorization");
            _client.DefaultRequestHeaders.Add("Authorization", "basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(clientId + ":" + secret)));

            if (!instanceUrl.EndsWith('/'))
            {
                instanceUrl += '/';
            }
            _client.BaseAddress = new Uri(instanceUrl);

            // get namespaces
            string address = instanceUrl + "infomodel/namespaces";
            HttpResponseMessage response = _client.Send(new HttpRequestMessage(HttpMethod.Get, address));

            string[] identifiers = JsonConvert.DeserializeObject <string[]>(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());

            _namespacesInCloudLibrary.Clear();
            foreach (string nodeset in identifiers)
            {
                string[] tuple = nodeset.Split(",");
                _namespacesInCloudLibrary.Add(tuple[0], tuple[1]);
            }

            // get names
            address  = instanceUrl + "infomodel/names";
            response = _client.Send(new HttpRequestMessage(HttpMethod.Get, address));
            string[] names = JsonConvert.DeserializeObject <string[]>(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());

            List <string> sortedNames = new List <string>(names);

            sortedNames.Sort();

            _namesInCloudLibrary.Clear();
            foreach (string name in sortedNames)
            {
                string[] tuple = name.Split(",");
                _namesInCloudLibrary.Add(tuple[0], tuple[1]);
            }

            sessionModel.NodesetIDs = new SelectList(_namesInCloudLibrary.Keys);

            return(View("Index", sessionModel));
        }
Ejemplo n.º 16
0
        public ActionResult Index()
        {
            List <Supervisor> supervisorList = new List <Supervisor>();
            OpcSessionModel   sessionModel   = new OpcSessionModel();

            Session["EndpointId"] = null;

            try
            {
                IEnumerable <SupervisorApiModel>      supervisors  = RegistryService.ListSupervisors();
                IEnumerable <ApplicationInfoApiModel> applications = RegistryService.ListApplications();
                Session["Applications"] = applications;

                if (supervisors != null)
                {
                    foreach (var supervisor in supervisors)
                    {
                        Supervisor supervisorInfo = new Supervisor();
                        supervisorInfo.supervisorModel = supervisor;
                        supervisorInfo.HasApplication  = false;
                        foreach (var application in applications)
                        {
                            if (application.SupervisorId == supervisor.Id)
                            {
                                supervisorInfo.HasApplication = true;
                            }
                        }
                        supervisorList.Add(supervisorInfo);
                    }
                }
            }
            catch (Exception e)
            {
                Trace.TraceWarning("Can not get supervisors list");
                string errorMessage = string.Format(Strings.BrowserOpcException, e.Message,
                                                    e.InnerException?.Message ?? "--", e?.StackTrace ?? "--");
                Trace.TraceWarning(errorMessage);
            }

            sessionModel.supervisorList = supervisorList;
            return(View("Index", sessionModel));
        }
        private async Task StartClientAndServer(OpcSessionModel sessionModel)
        {
            // (re-)start the UA server
            if (_application.Server != null)
            {
                _application.Stop();
            }

            await StartServerAsync().ConfigureAwait(false);

            // start the UA client
            Session session     = null;
            string  endpointURL = "opc.tcp://" + sessionModel.ServerIP + ":" + sessionModel.ServerPort + "/";

            session = await OpcSessionHelper.Instance.GetSessionAsync(_application.ApplicationConfiguration, HttpContext.Session.Id, endpointURL, true).ConfigureAwait(false);

            UpdateStatus("Connected");

            HttpContext.Session.SetString("EndpointUrl", endpointURL);
        }
        public ActionResult Deactivate(string endpointId)
        {
            Session["EndpointUrl"] = null;
            Session["EndpointId"]  = null;

            try
            {
                RegistryService.DeActivateEndpoint(endpointId);
            }
            catch (Exception exception)
            {
                // Generate an error to be shown in trace.
                string errorMessageTrace = string.Format(Strings.BrowserConnectException, exception.Message,
                                                         exception.InnerException?.Message ?? "--", exception?.StackTrace ?? "--");
                Trace.TraceError(errorMessageTrace);
            }

            OpcSessionModel sessionModel = new OpcSessionModel();

            return(Json(sessionModel));
        }
Ejemplo n.º 19
0
        public async Task <ActionResult> Download()
        {
            try
            {
                X509Certificate2 certificate = await OpcSessionHelper.Instance.GetApplicationCertificate();

                return(File(certificate.GetRawCertData(), MediaTypeNames.Application.Octet, certificate.FriendlyName + ".der"));
            }
            catch (Exception ex)
            {
                Trace.TraceError(ex.Message);
                OpcSessionModel sessionModel = new OpcSessionModel
                {
                    ErrorHeader  = Strings.BrowserCertDownloadError,
                    EndpointUrl  = string.Empty,
                    ErrorMessage = Strings.BrowserCertDownloadError
                };

                return(View("Error", sessionModel));
            }
        }
        public ActionResult Index()
        {
            OpcSessionModel sessionModel = new OpcSessionModel();

            if (OpcSessionHelper.Instance.InitResult != "Good")
            {
                sessionModel.ErrorMessage = OpcSessionHelper.Instance.InitResult;
                return(View("Error", sessionModel));
            }

            OpcSessionCacheData entry = null;

            if (OpcSessionHelper.Instance.OpcSessionCache.TryGetValue(Session.SessionID, out entry))
            {
                sessionModel.EndpointUrl = entry.EndpointURL;
                Session["EndpointUrl"]   = entry.EndpointURL;
                return(View("Browse", sessionModel));
            }

            sessionModel.PrepopulatedEndpoints = new SelectList(_prepopulatedEndpoints, "Value", "Text");
            return(View("Index", sessionModel));
        }
        public ActionResult Index()
        {
            OpcSessionModel sessionModel = new OpcSessionModel
            {
                SessionId  = HttpContext.Session.Id,
                NodesetIDs = new SelectList(new List <string>())
            };

            OpcSessionCacheData entry = null;

            if (OpcSessionHelper.Instance.OpcSessionCache.TryGetValue(HttpContext.Session.Id, out entry))
            {
                sessionModel.ServerIP   = entry.EndpointURL.Host;
                sessionModel.ServerPort = entry.EndpointURL.Port.ToString();

                HttpContext.Session.SetString("EndpointUrl", entry.EndpointURL.AbsoluteUri);

                return(View("Browse", sessionModel));
            }

            UpdateStatus("Additional Information Required");
            return(View("Index", sessionModel));
        }
        public ActionResult GenerateAAS()
        {
            try
            {
                string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "UANodeSet.aasx");
                using (Package package = Package.Open(packagePath, FileMode.Create))
                {
                    // add package origin part
                    PackagePart origin = package.CreatePart(new Uri("/aasx/aasx-origin", UriKind.Relative), MediaTypeNames.Text.Plain, CompressionOption.Maximum);
                    using (Stream fileStream = origin.GetStream(FileMode.Create))
                    {
                        var bytes = Encoding.ASCII.GetBytes("Intentionally empty.");
                        fileStream.Write(bytes, 0, bytes.Length);
                    }
                    package.CreateRelationship(origin.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aasx-origin");

                    // create package spec part
                    string packageSpecPath = Path.Combine(Directory.GetCurrentDirectory(), "aasenv-with-no-id.aas.xml");
                    using (StringReader reader = new StringReader(System.IO.File.ReadAllText(packageSpecPath)))
                    {
                        XmlSerializer aasSerializer = new XmlSerializer(typeof(AasEnv));
                        AasEnv        aasEnv        = (AasEnv)aasSerializer.Deserialize(reader);

                        aasEnv.AssetAdministrationShells.AssetAdministrationShell.SubmodelRefs.Clear();
                        aasEnv.Submodels.Clear();

                        foreach (string filename in _nodeSetFilenames)
                        {
                            string submodelPath = Path.Combine(Directory.GetCurrentDirectory(), "submodel.aas.xml");
                            using (StringReader reader2 = new StringReader(System.IO.File.ReadAllText(submodelPath)))
                            {
                                XmlSerializer aasSubModelSerializer = new XmlSerializer(typeof(AASSubModel));
                                AASSubModel   aasSubModel           = (AASSubModel)aasSubModelSerializer.Deserialize(reader2);

                                SubmodelRef nodesetReference = new SubmodelRef();
                                nodesetReference.Keys     = new Keys();
                                nodesetReference.Keys.Key = new Key
                                {
                                    IdType = "URI",
                                    Local  = true,
                                    Type   = "Submodel",
                                    Text   = "http://www.opcfoundation.org/type/opcua/" + Path.GetFileName(filename).Replace(".", "").ToLower()
                                };

                                aasEnv.AssetAdministrationShells.AssetAdministrationShell.SubmodelRefs.Add(nodesetReference);

                                aasSubModel.Identification.Text += Path.GetFileName(filename).Replace(".", "").ToLower();
                                aasSubModel.SubmodelElements.SubmodelElement.SubmodelElementCollection.Value.SubmodelElement.File.Value =
                                    aasSubModel.SubmodelElements.SubmodelElement.SubmodelElementCollection.Value.SubmodelElement.File.Value.Replace("TOBEREPLACED", Path.GetFileName(filename));
                                aasEnv.Submodels.Add(aasSubModel);
                            }
                        }

                        XmlTextWriter aasWriter = new XmlTextWriter(packageSpecPath, Encoding.UTF8);
                        aasSerializer.Serialize(aasWriter, aasEnv);
                        aasWriter.Close();
                    }

                    // add package spec part
                    PackagePart spec = package.CreatePart(new Uri("/aasx/aasenv-with-no-id/aasenv-with-no-id.aas.xml", UriKind.Relative), MediaTypeNames.Text.Xml);
                    using (FileStream fileStream = new FileStream(packageSpecPath, FileMode.Open, FileAccess.Read))
                    {
                        CopyStream(fileStream, spec.GetStream());
                    }
                    origin.CreateRelationship(spec.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aas-spec");

                    // add nodeset files
                    for (int i = 0; i < _nodeSetFilenames.Count; i++)
                    {
                        PackagePart supplementalDoc = package.CreatePart(new Uri("/aasx/" + Path.GetFileName(_nodeSetFilenames[i]), UriKind.Relative), MediaTypeNames.Text.Xml);
                        string      documentPath    = Path.Combine(Directory.GetCurrentDirectory(), _nodeSetFilenames[i]);
                        using (FileStream fileStream = new FileStream(documentPath, FileMode.Open, FileAccess.Read))
                        {
                            CopyStream(fileStream, supplementalDoc.GetStream());
                        }
                        package.CreateRelationship(supplementalDoc.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aas-suppl");
                    }
                }

                return(File(new FileStream(Path.Combine(Directory.GetCurrentDirectory(), "UANodeSet.aasx"), FileMode.Open, FileAccess.Read), "APPLICATION/octet-stream", "UANodeSet.aasx"));
            }
            catch (Exception ex)
            {
                OpcSessionModel sessionModel = new OpcSessionModel
                {
                    ErrorMessage = HttpUtility.HtmlDecode(ex.Message)
                };

                return(View("Error", sessionModel));
            }
        }