Yi Wang dd98b22b93 Add a guide about how to enable OPC UA
The project open62541 is used as an example. In this article,
it includes:

* How to build a container image with OPC UA client&server
* How to deploy the client&server to StarlingX

Story: 2007846
Task: 40138

Change-Id: I27b8b458bd967edc32273b22c9e8d870d96a8b99
Signed-off-by: Yi Wang <yi.c.wang@intel.com>
2020-07-06 16:04:54 +08:00

186 lines
5.2 KiB
ReStructuredText

==========================
Enable OPC UA on StarlingX
==========================
This guide describes how to enable
:abbr:`OPC UA (Open Platform Communications Unified Architecture)` on StarlingX.
.. contents::
:local:
:depth: 1
----------
Background
----------
As a cloud infrastructure software stack for the edge, Industrial IoT (IIoT)
is an important use case for StarlingX.
`OPC UA <https://opcfoundation.org/developer-tools/specifications-unified-architecture>`_
(**Open Platform Communications Unified Architecture**)
is a data exchange standard for industrial communication, which
integrates all functionalities from the existing OPC Classic specifications.
It is an indispensable part of Industry 4.0. For StarlingX, it is very
valuable to support OPC UA.
In this article, we'd like to share our practice of enabling OPC UA on
StarlingX.
-------------------------------------------------
Build a container image with OPC UA server/client
-------------------------------------------------
There are quite a few open source OPC UA implementations available. Our work
in this article is based on the project `open62541 <https://open62541.org/>`_,
which is a popular and free OPC UA implementation written in C&C++
language.
The example below shows the dockerfile used to build the container image. The
latest open62541 binary release v1.1 was installed.
::
From ubuntu:18.04
RUN apt-get update
RUN apt-get install -y wget
WORKDIR /opt
# install open62541 release package
RUN mkdir temp
RUN wget -qO- https://github.com/open62541/open62541/releases/download/v1.1/open62541-linux64.tar.gz | tar -xvz -C temp
RUN mv ./temp/open62541-linux64/bin/* /usr/bin/
RUN mv ./temp/open62541-linux64/include/* /usr/local/include/
RUN mv ./temp/open62541-linux64/lib/* /usr/lib/
RUN mv ./temp/open62541-linux64/share/open62541/tools .
RUN rm -r temp
ENV OPCUA_SERVER_IP "opcua-service.kube-system"
ENV OPCUA_SERVER_PORT "4840"
COPY run_ua_client.sh .
COPY run_ua_server.sh .
COPY ua_client .
``run_ua_client.sh`` and ``run_ua_server.sh`` are two simple scripts to launch
OPC UA server and OPC UA client. The objective of this work is to enable and
verify OPC UA on StarlingX platform. For simplicity, we chose the sample OPC UA
server provided by the open62541 release instead of developing our own OPC UA
server. The sample client of open62541 hardcoded the server address and port as
``localhost:4840``. We made some changes so it will accept two
arguments: server address and server port.
The content of ``run_ua_server.sh``:
::
#! /bin/sh
echo "start opc ua server ..."
ua_server_ctt.exe
The content of ``run_ua_client.sh``:
::
#! /bin/sh
n=1
while true
do
sleep 5
echo "start opc ua client for the $n time ..."
./ua_client $OPCUA_SERVER_IP $OPCUA_SERVER_PORT
n=$((n+1))
done
---------------------------
Deploy OPC UA server/client
---------------------------
In this step, we will demonstrate how to deploy OPC UA server and client with
the container image built in the previous step on StarlingX platform.
Here we assume the container image with the name ``stx-opcua-base`` has been
already pulled from a registry which StarlingX can access and uploaded into
StarlingX local registry.
We have two yaml files shown below for OPC UA server and client respectively.
::
apiVersion: v1
kind: Pod
metadata:
name: opcua-server
labels:
app: opcua-server
namespace: kube-system
spec:
hostNetwork: false
imagePullSecrets:
- name: registry-local-secret
containers:
- name: opcua-server
image: registry.local:9001/stx-opcua-base
command: ["/opt/run_ua_server.sh"]
---
apiVersion: v1
kind: Service
metadata:
name: opcua-service
namespace: kube-system
spec:
selector:
app: opcua-server
ports:
- protocol: TCP
port: 4840
targetPort: 4840
::
apiVersion: v1
kind: Pod
metadata:
name: opcua-client
labels:
app: opcua-client
namespace: kube-system
spec:
hostNetwork: false
imagePullSecrets:
- name: registry-local-secret
containers:
- name: opcua-client
image: registry.local:9001/stx-opcua-base
command: ["/opt/run_ua_client.sh"]
Once applied the two yaml files by the Kubernetes command
``kubectl apply -f opcua-server.yaml`` and
``kubectl apply -f opcua-client.yaml``,
two pods will be created. Then we can check the status of the two pods.
::
controller-1:~$ kubectl -n kube-system get po | grep opcua
opcua-client 1/1 Running 0 15m
opcua-server 1/1 Running 0 15m
We also can use below commands to check the output of OPC UA server and client.
The client was repeatedly reading some information from the server.
::
kubectl -n kube-system logs opcua-server
kubectl -n kube-system logs opcua-client
-------
Summary
-------
In this work, we took open62541 as an example to show how to enable OPC UA
server and clients on StarlingX platform. In the future, we may explore how to
operate more efficiently with OPC UA on StarlingX platform.