The OPC UA session Id.
Syntax
[NotNull()]
public UANodeId SessionId {get; set;}
Property Value
The value of this property cannot be null
(Nothing
in Visual Basic).
Because there is an implicit conversion from OpcLabs.EasyOpc.UA.AddressSpace.UANodeId to OpcLabs.EasyOpc.UA.UANodeDescriptor, in languages that support implicit conversion operators (such as C# or VB.NET), you can simply use the returned OpcLabs.EasyOpc.UA.AddressSpace.UANodeId in any place where the OpcLabs.EasyOpc.UA.UANodeDescriptor is expected as input, and the corresponding node descriptor will be constructed automatically.
Also, because the OpcLabs.EasyOpc.UA.AddressSpace.UANodeId has an implicit conversion to System.String, and it converts to the expanded text of the node Id (OpcLabs.EasyOpc.UA.AddressSpace.UANodeId.ExpandedText), in languages that support implicit conversion operators (such as C# or VB.NET), you can simply use the returned OpcLabs.EasyOpc.UA.AddressSpace.UANodeId in any place where expanded text of a node Id (a string) is expected as input, and the corresponding expanded text will be taken automatically from the node Id.
Exceptions
Exception | Description |
System.ArgumentNullException |
A null reference (Nothing in Visual Basic) is passed to a method that does not accept it as a valid argument.
This is a usage error, i.e. it will never occur (the exception will not be thrown) in a correctly written program. Your code should not catch this exception. |
Example
// A fully functional OPC UA demo server running in Windows Forms host.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client, server and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-OPCStudio-CSharp .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
using System.Linq;
using System.Windows.Forms;
using Microsoft.Extensions.DependencyInjection;
using OpcLabs.EasyOpc.UA;
using OpcLabs.EasyOpc.UA.Forms.Application;
using OpcLabs.EasyOpc.UA.OperationModel;
using OpcLabs.EasyOpc.UA.Services;
using UAServerDemoLibrary;
namespace UAServerWindowsFormsDemo
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// Instantiating the EasyUAServer here, and not inline where the field is declared, is important for it to
// acquire the proper synchronization context.
_server = new EasyUAServer();
}
private void Form1_Load(object sender, System.EventArgs e)
{
// Extend the form's system menu by a command for OPC UA application management.
EasyUAFormsApplication.Instance.AddToSystemMenu(this);
// Define various nodes.
DataNodes.AddToParent(_server.Objects);
DemoNodes.AddToParent(_server.Objects);
// Hook events to the server object.
_server.EndpointStateChanged += ServerOnEndpointStateChanged;
// Obtain the server connection monitoring service.
IEasyUAServerConnectionMonitoring serverConnectionMonitoring = _server.GetService<IEasyUAServerConnectionMonitoring>();
if (!(serverConnectionMonitoring is null))
{
// Hook events to the connection monitoring service.
serverConnectionMonitoring.ClientSessionConnected += ServerConnectionMonitoringOnClientSessionConnected;
serverConnectionMonitoring.ClientSessionDisconnected += ServerConnectionMonitoringOnClientSessionDisconnected;
}
_server.Start();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
_server.Stop();
}
private void ServerOnEndpointStateChanged(object sender, EasyUAServerEndpointStateChangedEventArgs e)
{
// Note that since we have created the EasyUAServer on the UI thread, we can access the UI controls in its
// event handlers directly, because the events are raised using the synchronization context acquired at time of
// the creation.
string endpointUrlString = e.EndpointUrlString;
ListViewItem listViewItem = endpointStateListView.Items.Cast<ListViewItem>().FirstOrDefault(item =>
item.Text == endpointUrlString);
if (listViewItem is null)
{
listViewItem = new ListViewItem(endpointUrlString);
endpointStateListView.Items.Add(listViewItem);
listViewItem.SubItems.Add("");
listViewItem.SubItems.Add("");
}
listViewItem.SubItems[1].Text = e.ConnectionState.ToString();
listViewItem.SubItems[2].Text = e.Exception?.Message ?? "";
}
private void ServerConnectionMonitoringOnClientSessionConnected(object sender, EasyUAClientSessionConnectionEventArgs e)
{
// Note that since we have created the EasyUAServer on the UI thread, we can access the UI controls in its
// event handlers directly, because the events are raised using the synchronization context acquired at time of
// the creation.
var listViewItem = new ListViewItem(e.SessionId.Identifier.ToString());
listViewItem.SubItems.Add(e.SessionName);
connectionsListView.Items.Add(listViewItem);
}
private void ServerConnectionMonitoringOnClientSessionDisconnected(object sender, EasyUAClientSessionConnectionEventArgs e)
{
// Note that since we have created the EasyUAServer on the UI thread, we can access the UI controls in its
// event handlers directly, because the events are raised using the synchronization context acquired at time of
// the creation.
string identifierString = e.SessionId.Identifier.ToString();
ListViewItem listViewItem = connectionsListView.Items.Cast<ListViewItem>().FirstOrDefault(item =>
item.Text == identifierString);
if (!(listViewItem is null))
connectionsListView.Items.Remove(listViewItem);
}
private readonly EasyUAServer _server;
}
}
' A fully functional OPC UA demo server running in Windows Forms host.
'
' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
' OPC client and subscriber examples in VB.NET on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBNET .
' Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
' a commercial license in order to use Online Forums, and we reply to every post.
Imports System.Linq
Imports System.Windows.Forms
Imports Microsoft.Extensions.DependencyInjection
Imports OpcLabs.EasyOpc.UA
Imports OpcLabs.EasyOpc.UA.Forms.Application
Imports OpcLabs.EasyOpc.UA.OperationModel
Imports OpcLabs.EasyOpc.UA.Services
Imports UAServerDemoLibrary
Public Class MainForm
Sub New()
InitializeComponent()
' Instantiating the EasyUAServer here, and not inline where the field is declared, is important for it to
' acquire the proper synchronization context.
_server = New EasyUAServer()
End Sub
Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Extend the form's system menu by a command for OPC UA application management.
EasyUAFormsApplication.Instance.AddToSystemMenu(Me)
' Define various nodes.
DataNodes.AddToParent(_server.Objects)
DemoNodes.AddToParent(_server.Objects)
' Hook events to the server object.
AddHandler _server.EndpointStateChanged, AddressOf ServerOnEndpointStateChanged
' Obtain the server connection monitoring service.
Dim serverConnectionMonitoring As IEasyUAServerConnectionMonitoring = _server.GetService(Of IEasyUAServerConnectionMonitoring)()
If (Not (serverConnectionMonitoring Is Nothing)) Then
' Hook events to the connection monitoring service.
AddHandler serverConnectionMonitoring.ClientSessionConnected, AddressOf ServerConnectionMonitoringOnClientSessionConnected
AddHandler serverConnectionMonitoring.ClientSessionDisconnected, AddressOf ServerConnectionMonitoringOnClientSessionDisconnected
End If
_server.Start()
End Sub
Private ReadOnly _server As EasyUAServer
Private Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
_server.Stop()
End Sub
Private Sub ServerOnEndpointStateChanged(sender As Object, e As EasyUAServerEndpointStateChangedEventArgs)
' Note that since we have created the EasyUAServer on the UI thread, we can access the UI controls in its
' event handlers directly, because the events are raised using the synchronization context acquired at time of
' the creation.
Dim endpointUrlString As String = e.EndpointUrlString
Dim listViewItem As ListViewItem = endpointStateListView.Items.Cast(Of ListViewItem)().FirstOrDefault(Function(item) _
item.Text = endpointUrlString)
If (listViewItem Is Nothing) Then
listViewItem = New ListViewItem(endpointUrlString)
endpointStateListView.Items.Add(listViewItem)
listViewItem.SubItems.Add("")
listViewItem.SubItems.Add("")
End If
listViewItem.SubItems(1).Text = e.ConnectionState.ToString()
listViewItem.SubItems(2).Text = If(e.Exception?.Message, "")
End Sub
Private Sub ServerConnectionMonitoringOnClientSessionConnected(sender As Object, e As EasyUAClientSessionConnectionEventArgs)
' Note that since we have created the EasyUAServer on the UI thread, we can access the UI controls in its
' event handlers directly, because the events are raised using the synchronization context acquired at time of
' the creation.
Dim listViewItem = New ListViewItem(e.SessionId.Identifier.ToString())
listViewItem.SubItems.Add(e.SessionName)
connectionsListView.Items.Add(listViewItem)
End Sub
Private Sub ServerConnectionMonitoringOnClientSessionDisconnected(sender As Object, e As EasyUAClientSessionConnectionEventArgs)
' Note that since we have created the EasyUAServer on the UI thread, we can access the UI controls in its
' event handlers directly, because the events are raised using the synchronization context acquired at time of
' the creation.
Dim identifierString As String = e.SessionId.Identifier.ToString()
Dim listViewItem As ListViewItem = connectionsListView.Items.Cast(Of ListViewItem)().FirstOrDefault(Function(item) _
item.Text = identifierString)
If (Not (listViewItem Is Nothing)) Then
connectionsListView.Items.Remove(listViewItem)
End If
End Sub
End Class
Requirements
Target Platforms: .NET Framework: Windows 10 (selected versions), Windows 11 (selected versions), Windows Server 2016, Windows Server 2022; .NET: Linux, macOS, Microsoft Windows
See Also