OPC Unified Architecture is the most recent OLE for process control (OPC) specification from the OPC Foundation. OPC-UA servers communicate with clients via exposed endpoints.
The diagram below shows the steps required for an OPC-UA client to discover the OPC-UA server location, discover the server's endpoints and start a secure session with an endpoint.
+-------------------+   +-------------------+   +-------------------+
!                   !   !       Local       !   !                   !
!      Client       !   ! Discovery Server  !   !      Server       !
+---------+---------+   +---------+---------+   +---+-----------+---+
          .                       .                 .           .
          .     FindServers()     .                 .           .
          •----------------------»•                 .           .
          •                       •                 .           .
          •  ServerDescription[]  •                 .           .
          •«----------------------•                 .           .
          .                       .                 .           .
          .              GetEndpoints()             .           .
          •----------------------------------------»•           .
          •                                         •           .
          •           EndpointDescription[]         •           .
          •«----------------------------------------•           .
          .                                         .           .
          .                                         .           .
          •           CreateSecureChannel()         .           •
          •----------------------------------------------------»•
          •                                         .           •
          .                                         .           .
                                                Discovery    Session
                                                Endpoint     Endpoint
In the case that a client already has the address of the OPC UA server, it only sends a GetEndpoints request to the server.
The following is a quick proof-of-concept demonstration that the server and the client can communicate with each other over PageKite on an Ubuntu working environment.
First of all, download the Unified Automation C++ based OPC UA Client/Server SDK Bundle - GCC4.5.1 - Linux32 and uncompress it.
Now edit the ServerConfig.xml file in the sdk/bin folder, find the <UaEndpoint> section, uncomment the <StackUrl> setting and bind the endpoint to a port of your choice, like this:
<StackUrl>opc.tcp://localhost:52520</StackUrl>
You may want to change the <Url> setting too:
<Url>opc.tcp://localhost:4841</Url>
Now run the uademoserver, it will print a message like this:
Initializing keyboard.
***************************************************
 Server opened endpoints for following URLs:
     opc.tcp://localhost:4841
***************************************************
 Press x to shutdown server
***************************************************
The server is physically bound to port 52520 so we are adding a new kite like this:
pagekite --add 52520 raw:OPCUANAME.pagekite.net
Run pagekite:
[...]
Flying localhost:52520 as raw://OPCUANAME.pagekite.me/ (HTTP proxied)
[...]
Unfortunately, I couldn't find any OPC-UA client with native HTTP proxy support.
As a workaround, we shall use desproxy, a TCP tunnel for HTTP proxies:
desproxy OPCUANAME.pagekite.me 52520 OPCUANAME.pagekite.me 443 4841
Command synopsis:
desproxy remote_host remote_port proxy_host proxy_port local_port
Now you should be able to connect to opc.tcp://localhost:4841 with any client: my choice is Unified Automation UaExpert, Windows users may like TerxaSoft GmbH visualXplorer .NET too.
Try and add a new server, and start browsing: if everything is going well, desproxy will output a series of messages like these:
Connection request from 127.0.0.1, port 50737
Connecting to http proxy (OPCUANAME.pagekite.me:443)
Connection #0: bidirectional connection stablished
Connection #0: client - proxy   56 bytes read
Connection #0: proxy - client   28 bytes read
Connection #0: client - proxy  133 bytes read
[...]
If both your client and server are on the same machine, your setup is now looking like in the diagram below.
+-------------------------+
!                         !
!  +-------------------+  !
!  !                   !  !
!  !      OPC-UA       !  !
!  !      Client       !  !
!  +---------+---------+  !
!            !            !
!       (port 4841)       !
!  +---------+---------+  !  +-----------+
!  !                   !  !  !           !
!  !     Desproxy      +-----+           !
!  !                   !  !  !           !
!  +-------------------+  !  !           !
!                         !  ! PageKite  !
!  +-------------------+  !  ! Front-end !
!  !                   !  !  !           !
!  !     PageKite      +-----+           !
!  !     Back-end      !  !  !           !
!  +---------+---------+  !  +-----------+
!            !            !
!      (port 52520)       !
!  +---------+---------+  !
!  !                   !  !
!  !      OPC-UA       !  !
!  !      Server       !  !
!  +-------------------+  !
!                         !
+-------------------------+
Comments