From dd98b22b93291a1e0c6bbc2beee99f675e98e6a4 Mon Sep 17 00:00:00 2001 From: Yi Wang Date: Tue, 23 Jun 2020 15:22:09 +0800 Subject: [PATCH] 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 --- doc/source/developer_resources/index.rst | 1 + doc/source/developer_resources/stx_opcua.rst | 185 +++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 doc/source/developer_resources/stx_opcua.rst diff --git a/doc/source/developer_resources/index.rst b/doc/source/developer_resources/index.rst index df111ec44..fbac0b24a 100644 --- a/doc/source/developer_resources/index.rst +++ b/doc/source/developer_resources/index.rst @@ -24,5 +24,6 @@ Developer Resources architecture_docs starlingx_patching stx_ipv6_deployment + stx_opcua diff --git a/doc/source/developer_resources/stx_opcua.rst b/doc/source/developer_resources/stx_opcua.rst new file mode 100644 index 000000000..aa542313e --- /dev/null +++ b/doc/source/developer_resources/stx_opcua.rst @@ -0,0 +1,185 @@ +========================== +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 `_ +(**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 `_, +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.