/// <summary> /// Creates the node managers for the server. /// </summary> /// <remarks> /// This method allows the sub-class create any additional node managers which it uses. The SDK /// always creates a CoreNodesManager which handles the built-in nodes defined by the specification. /// Any additional NodeManagers are expected to handle application specific nodes. /// </remarks> protected override MasterNodeManager CreateMasterNodeManager(IServerInternal server, ApplicationConfiguration configuration) { var nodeManagers = new List <INodeManager>(); if (!string.IsNullOrEmpty(NodesFileName) && !File.Exists(NodesFileName)) { string errorMessage = $"The user node configuration file {NodesFileName} does not exist."; Logger.Error(errorMessage); throw new Exception(errorMessage); } // Add encodable complex types. server.Factory.AddEncodeableTypes(Assembly.GetExecutingAssembly()); PlcNodeManager = new PlcNodeManager(server, configuration, NodesFileName); nodeManagers.Add(PlcNodeManager); if (PlcSimulation.AddSimpleEventsSimulation) { SimpleEventsNodeManager = new SimpleEventsNodeManager(server, configuration); nodeManagers.Add(SimpleEventsNodeManager); } if (PlcSimulation.AddAlarmSimulation) { AlarmNodeManager = new AlarmConditionServerNodeManager(server, configuration); nodeManagers.Add(AlarmNodeManager); } var masterNodeManager = new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); return(masterNodeManager); }
public async Task RegisterNamespaceManagerNewNamespace() { var fixture = new ServerFixture <StandardServer>(); try { //-- Arrange const string ns = "http://test.org/UA/Data/"; var nodeManager = new Mock <INodeManager>(); nodeManager.Setup(x => x.NamespaceUris).Returns(new List <string>()); //-- Act var server = await fixture.StartAsync(TestContext.Out).ConfigureAwait(false); var sut = new MasterNodeManager( server.CurrentInstance, fixture.Config, null, nodeManager.Object); sut.RegisterNamespaceManager(ns, nodeManager.Object); //-- Assert Assert.Contains(ns, server.CurrentInstance.NamespaceUris.ToArray()); var registeredManagers = sut.NamespaceManagers[server.CurrentInstance.NamespaceUris.GetIndex(ns)]; Assert.AreEqual(1, registeredManagers.Length); Assert.Contains(nodeManager.Object, registeredManagers); } finally { await fixture.StopAsync().ConfigureAwait(false); } }
/// <summary> /// Creates the node managers for the server. /// </summary> /// <remarks> /// This method allows the sub-class create any additional node managers which it uses. The SDK /// always creates a CoreNodeManager which handles the built-in nodes defined by the specification. /// Any additional NodeManagers are expected to handle application specific nodes. /// /// Applications with small address spaces do not need to create their own NodeManagers and can add any /// application specific nodes to the CoreNodeManager. Applications should use custom NodeManagers when /// the structure of the address space is stored in another system or when the address space is too large /// to keep in memory. /// </remarks> protected override MasterNodeManager CreateMasterNodeManager( IServerInternal server, ApplicationConfiguration configuration) { Debug.WriteLine("Creating the Node Managers."); List <INodeManager> nodeManagers = new List <INodeManager>(); // create the custom node managers. var aasnm = new global::AasOpcUaServer.AasModeManager( server, configuration, thePackageEnv, theServerOptions); nodeManagers.Add(aasnm); // create master node manager. var x = new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); // try to do some fixes if (x.NodeManagers.Count > 0) { var cm = x.NodeManagers[0] as CustomNodeManager2; //// (old) code for fixing node issued //// if (cm != null) //// cm.AasInjectedNodes = aasnm.GenerateInjectNodeStates(); } // ok return(x); }
private void ConvertContainer2Children(GameObject lastOrgan) { MasterNodeManager masterNode = lastOrgan.GetComponent <MasterNodeManager>(); if (masterNode == null) { return; } masterNode.ConvertContainer2Children(organObjectList); }
/// <summary> /// Creates the node managers for the server. /// </summary> /// <remarks> /// This method allows the sub-class create any additional node managers which it uses. The SDK /// always creates a CoreNodeManager which handles the built-in nodes defined by the specification. /// Any additional NodeManagers are expected to handle application specific nodes. /// </remarks> protected override MasterNodeManager CreateMasterNodeManager(IServerInternal server, ApplicationConfiguration configuration) { PlcNodeManager = new PlcNodeManager(server, configuration); List <INodeManager> nodeManagers = new List <INodeManager> { PlcNodeManager, }; MasterNodeManager masterNodeManager = new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); return(masterNodeManager); }
void OnTriggerStay(Collider other) { if (other.gameObject.tag == "Organ") { collideWithOtherOrgan = true; MasterNodeManager masternode = gameObject.GetComponentInParent <MasterNodeManager>(); if (masternode != null) { masternode.UpdateCollideWith(gameObject, true); } } }
public void They_should_identify_the_one_that_is_the_master() { Address.InitializeLocalAddress("test"); var m = new MasterNodeManager(); string a = null, b = null; m.YieldMasterNode("test@A", true, s => a = s); m.YieldMasterNode("test@B", false, s => b = s); Thread.Sleep(MasterNodeManager.presenceInterval + TimeSpan.FromSeconds(1)); Assert.AreEqual(a, b); Assert.AreEqual("test@A", a); }
/// <summary> /// Creates the node managers for the server. /// </summary> /// <remarks> /// This method allows the sub-class create any additional node managers which it uses. The SDK /// always creates a CoreNodesManager which handles the built-in nodes defined by the specification. /// Any additional NodeManagers are expected to handle application specific nodes. /// </remarks> protected override MasterNodeManager CreateMasterNodeManager(IServerInternal server, ApplicationConfiguration configuration) { var nodeManagers = new List <INodeManager>(); if (!string.IsNullOrEmpty(NodesFileName) && !File.Exists(NodesFileName)) { string errorMessage = $"The user node configuration file {NodesFileName} does not exist."; Logger.Error(errorMessage); throw new Exception(errorMessage); } PlcNodeManager = new PlcNodeManager(server, configuration, NodesFileName); nodeManagers.Add(PlcNodeManager); var masterNodeManager = new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); return(masterNodeManager); }
public async Task UnregisterNamespaceManagerNotInCollection() { var fixture = new ServerFixture <StandardServer>(); try { //-- Arrange const string ns = "http://test.org/UA/Data/"; var namespaceUris = new List <string> { ns }; var firstNodeManager = new Mock <INodeManager>(); firstNodeManager.Setup(x => x.NamespaceUris).Returns(namespaceUris); var secondNodeManager = new Mock <INodeManager>(); secondNodeManager.Setup(x => x.NamespaceUris).Returns(namespaceUris); var thirdNodeManager = new Mock <INodeManager>(); thirdNodeManager.Setup(x => x.NamespaceUris).Returns(namespaceUris); //-- Act var server = await fixture.StartAsync(TestContext.Out).ConfigureAwait(false); var sut = new MasterNodeManager( server.CurrentInstance, fixture.Config, null, firstNodeManager.Object, // Do not add the secondNodeManager to additionalManagers thirdNodeManager.Object); var result = sut.UnregisterNamespaceManager(ns, secondNodeManager.Object); //-- Assert Assert.IsFalse(result); Assert.Contains(ns, server.CurrentInstance.NamespaceUris.ToArray()); var registeredManagers = sut.NamespaceManagers[server.CurrentInstance.NamespaceUris.GetIndex(ns)]; Assert.AreEqual(2, registeredManagers.Length); Assert.Contains(firstNodeManager.Object, registeredManagers); Assert.Contains(thirdNodeManager.Object, registeredManagers); } finally { await fixture.StopAsync().ConfigureAwait(false); } }
public async Task UnregisterNamespaceManagerInCollection(int totalManagers, int indexToRemove) { var fixture = new ServerFixture <StandardServer>(); try { //-- Arrange const string ns = "http://test.org/UA/Data/"; var namespaceUris = new List <string> { ns }; var additionalManagers = new INodeManager[totalManagers]; for (int ii = 0; ii < totalManagers; ii++) { var nodeManager = new Mock <INodeManager>(); nodeManager.Setup(x => x.NamespaceUris).Returns(namespaceUris); additionalManagers[ii] = nodeManager.Object; } var nodeManagerToRemove = additionalManagers[indexToRemove]; //-- Act var server = await fixture.StartAsync(TestContext.Out).ConfigureAwait(false); var sut = new MasterNodeManager( server.CurrentInstance, fixture.Config, null, additionalManagers); var result = sut.UnregisterNamespaceManager(ns, nodeManagerToRemove); //-- Assert Assert.IsTrue(result); Assert.Contains(ns, server.CurrentInstance.NamespaceUris.ToArray()); var registeredManagers = sut.NamespaceManagers[server.CurrentInstance.NamespaceUris.GetIndex(ns)]; Assert.AreEqual(totalManagers - 1, registeredManagers.Length); Assert.That(registeredManagers, Has.No.Member(nodeManagerToRemove)); } finally { await fixture.StopAsync().ConfigureAwait(false); } }
public async Task UnregisterNamespaceManagerUnknownNamespace() { var fixture = new ServerFixture <StandardServer>(); try { //-- Arrange const string originalNs = "http://test.org/UA/Data/"; var originalNodeManager = new Mock <INodeManager>(); originalNodeManager.Setup(x => x.NamespaceUris).Returns(new List <string> { originalNs }); const string newNs = "http://test.org/UA/Data/Instance"; var newNodeManager = new Mock <INodeManager>(); newNodeManager.Setup(x => x.NamespaceUris).Returns(new List <string> { originalNs, newNs }); //-- Act var server = await fixture.StartAsync(TestContext.Out).ConfigureAwait(false); var sut = new MasterNodeManager( server.CurrentInstance, fixture.Config, null, originalNodeManager.Object); var result = sut.UnregisterNamespaceManager(newNs, newNodeManager.Object); //-- Assert Assert.IsFalse(result); Assert.That(server.CurrentInstance.NamespaceUris.ToArray(), Has.No.Member(newNs)); Assert.Contains(originalNs, server.CurrentInstance.NamespaceUris.ToArray()); var registeredManagers = sut.NamespaceManagers[server.CurrentInstance.NamespaceUris.GetIndex(originalNs)]; Assert.AreEqual(1, registeredManagers.Length); Assert.Contains(originalNodeManager.Object, registeredManagers); } finally { await fixture.StopAsync().ConfigureAwait(false); } }
/// <summary> /// Creates the node managers for the server. /// </summary> /// <remarks> /// This method allows the sub-class create any additional node managers which it uses. The SDK /// always creates a CoreNodesManager which handles the built-in nodes defined by the specification. /// Any additional NodeManagers are expected to handle application specific nodes. /// </remarks> protected override MasterNodeManager CreateMasterNodeManager(IServerInternal server, ApplicationConfiguration configuration) { var nodeManagers = new List <INodeManager>(); if (!string.IsNullOrEmpty(NodesFileName) && !File.Exists(NodesFileName)) { string errorMessage = $"The user node configuration file {NodesFileName} does not exist."; Logger.Error(errorMessage); throw new Exception(errorMessage); } // Add encodable complex types. server.Factory.AddEncodeableTypes(Assembly.GetExecutingAssembly()); string targetNamespace = Opc.Ua.Namespaces.OpcUa; if (CompiledModels != null) { Assembly loadedAssembly = Assembly.LoadFile(CompiledModels); Logger.Information($"Loaded assembly {loadedAssembly.FullName}"); server.Factory.AddEncodeableTypes(loadedAssembly); foreach (var t in loadedAssembly.DefinedTypes) { if (t.FullName.EndsWith(".Namespaces")) { foreach (var f in t.GetFields()) { Logger.Information($"Namespace {f.Name} {f.GetRawConstantValue()}"); targetNamespace = f.GetRawConstantValue() as string; } } } PlcNodeManager = new PlcNodeManager(server, configuration, loadedAssembly, targetNamespace, NodesFileName); } else { PlcNodeManager = new PlcNodeManager(server, configuration, NodesFileName); } nodeManagers.Add(PlcNodeManager); var masterNodeManager = new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); return(masterNodeManager); }
/// <summary> /// Creates the node managers for the server. /// </summary> /// <remarks> /// This method allows the sub-class create any additional node managers which it uses. The SDK /// always creates a CoreNodeManager which handles the built-in nodes defined by the specification. /// Any additional NodeManagers are expected to handle application specific nodes. /// </remarks> protected override MasterNodeManager CreateMasterNodeManager(IServerInternal server, ApplicationConfiguration configuration) { if (!String.IsNullOrEmpty(Program.NodesFile) && File.Exists(Program.NodesFile)) { PlcNodeManager = new PlcNodeManagerFromFile(server, configuration, Program.NodesFile); } else { PlcNodeManager = new PlcNodeManager(server, configuration); } List <INodeManager> nodeManagers = new List <INodeManager> { PlcNodeManager, }; MasterNodeManager masterNodeManager = new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); return(masterNodeManager); }
/// <summary> /// Creates the node managers for the server. /// </summary> /// <remarks> /// This method allows the sub-class create any additional node managers which it uses. The SDK /// always creates a CoreNodeManager which handles the built-in nodes defined by the specification. /// Any additional NodeManagers are expected to handle application specific nodes. /// /// Applications with small address spaces do not need to create their own NodeManagers and can add any /// application specific nodes to the CoreNodeManager. Applications should use custom NodeManagers when /// the structure of the address space is stored in another system or when the address space is too large /// to keep in memory. /// </remarks> protected override MasterNodeManager CreateMasterNodeManager(IServerInternal server, ApplicationConfiguration configuration) { Debug.WriteLine("Creating the Node Managers."); List <INodeManager> nodeManagers = new List <INodeManager>(); // create the custom node managers. // TODO (MIHO, 2021-01-01): re-implement multi environment UA server again! var aasnm = new global::AasOpcUaServer.AasModeManager(server, configuration, thePackageEnv, theServerOptions); nodeManagers.Add(aasnm); // create master node manager. var x = new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); // try to do some fixes if (x.NodeManagers.Count > 0) { var cm = x.NodeManagers[0] as CustomNodeManager2; } // ok return(x); }
/// <summary> /// Stores the MasterNodeManager and the CoreNodeManager /// </summary> /// <param name="nodeManager">The node manager.</param> public void SetNodeManager(MasterNodeManager nodeManager) { m_nodeManager = nodeManager; m_diagnosticsNodeManager = nodeManager.DiagnosticsNodeManager; m_coreNodeManager = nodeManager.CoreNodeManager; }
/// <summary> /// 启动服务 /// </summary> /// <param name="configuration"></param> protected override void StartApplication(ApplicationConfiguration configuration) { lock (m_lock) { try { // create the datastore for the instance. m_serverInternal = new ServerInternalData( ServerProperties, configuration, MessageContext, new CertificateValidator(), InstanceCertificate); // create the manager responsible for providing localized string resources. ResourceManager resourceManager = CreateResourceManager(m_serverInternal, configuration); // create the manager responsible for incoming requests. RequestManager requestManager = new RequestManager(m_serverInternal); // create the master node manager. MasterNodeManager masterNodeManager = new MasterNodeManager(m_serverInternal, configuration, null); // add the node manager to the datastore. m_serverInternal.SetNodeManager(masterNodeManager); // put the node manager into a state that allows it to be used by other objects. masterNodeManager.Startup(); // create the manager responsible for handling events. EventManager eventManager = new EventManager(m_serverInternal, (uint)configuration.ServerConfiguration.MaxEventQueueSize); // creates the server object. m_serverInternal.CreateServerObject( eventManager, resourceManager, requestManager); // create the manager responsible for aggregates. m_serverInternal.AggregateManager = CreateAggregateManager(m_serverInternal, configuration); // start the session manager. SessionManager sessionManager = new SessionManager(m_serverInternal, configuration); sessionManager.Startup(); // start the subscription manager. SubscriptionManager subscriptionManager = new SubscriptionManager(m_serverInternal, configuration); subscriptionManager.Startup(); // add the session manager to the datastore. m_serverInternal.SetSessionManager(sessionManager, subscriptionManager); ServerError = null; // set the server status as running. SetServerState(ServerState.Running); // monitor the configuration file. if (!String.IsNullOrEmpty(configuration.SourceFilePath)) { var m_configurationWatcher = new ConfigurationWatcher(configuration); m_configurationWatcher.Changed += new EventHandler <ConfigurationWatcherEventArgs>(this.OnConfigurationChanged); } CertificateValidator.CertificateUpdate += OnCertificateUpdate; //60s后开始清理过期服务列表,此后每60s检查一次 m_timer = new Timer(ClearNoliveServer, null, 60000, 60000); Console.WriteLine("Discovery服务已启动完成,请勿退出程序!!!"); } catch (Exception e) { Utils.Trace(e, "Unexpected error starting application"); m_serverInternal = null; ServiceResult error = ServiceResult.Create(e, StatusCodes.BadInternalError, "Unexpected error starting application"); ServerError = error; throw new ServiceResultException(error); } } }
void Update() { bool mouseButtonUp = Input.GetMouseButtonUp(0); if (mouseButtonUp) { Vector3 mouseWorldPosition = GetMouseWorldPosition(); if (growIconCoroutine != null) { StopCoroutine(growIconCoroutine); } if (mode == Mode.IDLE) { bool tutoAllows = !GameScenario.IS_TUTORIAL || GameScenario.GetInstance().GetCurrentState() >= GameScenario.RUNNING_OUT_OF_BLUE; if (MouseIsOverTheGround() && tutoAllows) { ShowOrganSettlementIcons(mouseWorldPosition); CursorManager.GetInstance().TriggerSelectionMenuCursor(); Play(openMenuClip); mode = Mode.MENU; } } else if (mode == Mode.MENU) { OrganSettlementIcon selectedIcon = GetSelectedIcon(); bool removeMenu = true; if (selectedIcon != null) { if (GameManager.GetInstance().Buy(iconMap[selectedIcon].resourcesType)) { organObjectList.Add(InstantiateOrgan(new Vector3(mouseWorldPosition.x, 1f, mouseWorldPosition.z), iconMap[selectedIcon])); CursorManager.GetInstance().DestroyStaticCursor(); mode = Mode.SETTLEMENT; Play(closeMenuClip); } else { selectedIcon.LaunchCannotBuyAnimation(); removeMenu = false; Play(errorClip); } } else { CursorManager.GetInstance().TriggerNavigationCursorFromSettlementManager(); mode = Mode.IDLE; Play(closeMenuClip); } if (removeMenu) { List <OrganSettlementIcon> iconList = new List <OrganSettlementIcon>(iconMap.Keys); for (int i = 0; i < iconList.Count; i++) { Destroy(iconList[i].gameObject); } iconMap.Clear(); } } else if (mode == Mode.SETTLEMENT) { GameObject lastOrgan = organObjectList[organObjectList.Count - 1]; bool status = lastOrgan.GetComponent <Organ>().CollideWithOtherOrgan; MasterNodeManager masternode = lastOrgan.GetComponent <MasterNodeManager>(); if (masternode != null) { status = status | masternode.GetCollideWithOtherOrgan(); } if (!status) { SetSpriteSortingLayerName(lastOrgan, "Default"); CursorManager.GetInstance().TriggerNavigationCursorFromSettlementManager(); mode = Mode.IDLE; if (GameScenario.IS_TUTORIAL) { GameScenario.GetInstance().ReachState(GameScenario.CLICK_MAP); } ConvertContainer2Children(lastOrgan); } else { Play(errorClip); } } } if (mode == Mode.SETTLEMENT) { Vector3 mouseWorldPosition = GetMouseWorldPosition(); GameObject lastOrganInstantiated = organObjectList[organObjectList.Count - 1]; lastOrganInstantiated.transform.position = new Vector3(mouseWorldPosition.x, 1f, mouseWorldPosition.z); lastOrganInstantiated.transform.eulerAngles = new Vector3(90, 0, 0); bool status = lastOrganInstantiated.GetComponent <Organ>().CollideWithOtherOrgan; MasterNodeManager masternode = lastOrganInstantiated.GetComponent <MasterNodeManager>(); if (masternode != null) { status = status | masternode.GetCollideWithOtherOrgan(); } if (status) { lastOrganInstantiated.GetComponent <Organ>().SetToForbiddenLook(); } else { lastOrganInstantiated.GetComponent <Organ>().RevertLook(); } } }