Skip to content

An open-source communication stack implementation of IEC 62541 aka OPC UA (OPC Unified Architecture) licensed under LGPL + static linking exception.

License

Unknown, CC0-1.0 licenses found

Licenses found

Unknown
LICENSE
CC0-1.0
LICENSE-CC0

aroth-fastprotect/open62541

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

open62541

An open-source communication stack implementation of OPC UA (OPC Unified Architecture) licensed under LGPL + static linking exception.

Ohloh Project Status Build Status Coverage Status Coverity Scan Build Status

What is currently working?

The project is in an early stage. We retain the right to break APIs until a first stable release.

  • Binary serialization of all data types: 100%
  • Node storage and setup of a minimal namespace zero: 100%
  • Standard OPC UA Clients can connect/open a SecureChannel/open a Session: 100%
  • Browsing/reading and writing attributes: 100%
  • Advanced SecureChannel and Session Management: 75%

Documentation

Documentation is generated from Doxygen annotations in the source code. The current version can be accessed at http://open62541.org/doxygen/.

Example Server Implementation

#include <stdio.h>
#include <signal.h>

// provided by the open62541 lib
#include "ua_server.h"
#include "ua_namespace_0.h"

// provided by the user, implementations available in the /examples folder
#include "logger_stdout.h"
#include "networklayer_tcp.h"

UA_Boolean running = UA_TRUE;
void stopHandler(int sign) {
	running = UA_FALSE;
}

void serverCallback(UA_Server *server) {
    // add your maintenance functionality here
    printf("does whatever servers do\n");
}

int main(int argc, char** argv) {
	signal(SIGINT, stopHandler); /* catches ctrl-c */

    /* init the server */
	#define PORT 16664
	UA_String endpointUrl;
	UA_String_copyprintf("opc.tcp://127.0.0.1:%i", &endpointUrl, PORT);
	UA_Server *server = UA_Server_new(&endpointUrl, NULL);

    /* add a variable node */
    UA_Int32 myInteger = 42;
    UA_String myIntegerName;
    UA_STRING_STATIC(myIntegerName, "The Answer");
    UA_Server_addScalarVariableNode(server,
                 /* browse name, the value and the datatype's vtable */
                 &myIntegerName, (void*)&myInteger, &UA_TYPES[UA_INT32],
                 /* the parent node where the variable shall be attached */
                 &UA_NODEIDS[UA_OBJECTSFOLDER],
                 /* the (hierarchical) referencetype from the parent */
                 &UA_NODEIDS[UA_HASCOMPONENT]);

    /* attach a network layer */
	NetworklayerTCP* nl = NetworklayerTCP_new(UA_ConnectionConfig_standard, PORT);
	printf("Server started, connect to to opc.tcp://127.0.0.1:%i\n", PORT);

    /* run the server loop */
	struct timeval callback_interval = {1, 0}; // 1 second
	NetworkLayerTCP_run(nl, server, callback_interval, serverCallback, &running);
    
    /* clean up */
	NetworklayerTCP_delete(nl);
	UA_Server_delete(server);
    UA_String_deleteMembers(&endpointUrl);
	return 0;
}

Build Procedure

Ubuntu

Install build infrastructure

sudo apt-get install git build-essential gcc cmake python python-lxml
Notes on older systems e.g. 12.04 LTS
  • Manual install of check framework 0.9.10 (symptoms like "error: implicit declaration of function ‘ck_assert_ptr_eq’")
wget http://security.ubuntu.com/ubuntu/pool/main/c/check/check_0.9.10-6ubuntu3_amd64.deb
sudo dpkg -i check_0.9.10-6ubuntu3_amd64.deb

or for i386

wget http://security.ubuntu.com/ubuntu/pool/main/c/check/check_0.9.10-6ubuntu3_i386.deb
sudo dpkg -i check_0.9.10-6ubuntu3_386.deb
  • Manuall install of gcc-4.8 (symptoms like "error: initialization discards ‘const’ qualifier from pointer target type [-Werror]")
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update; sudo apt-get install gcc-4.8
sudo update-alternatives --remove-all gcc 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
sudo update-alternatives --config gcc

Build

git clone https://github.com/acplt/open62541.git
cd open62541
mkdir build
cmake .. # generate the build scripts
# Optionally create an Eclipse project: cmake -G "Eclipse CDT4 - Unix Makefiles" .. 
make # creates executables in the build directory

# enable additional features
sudo apt-get install libexpat1-dev # for XML-encoding
sudo apt-get install liburcu-dev # for multithreading
sudo apt-get install check # for unit tests
sudo apt-get install graphviz doxygen # for documentation generation

ccmake .. # to select features for compilation. Use "cmake-gui .." for more eye-candy
make
make test # unit tests
make doc # generate documentation

Windows (Visual Studio)

python <path-to>\get-pip.py
python -m pip install lxml
cd <path-to>\open62541
mkdir build
cd build
<path-to>\cmake.exe .. -G "Visual Studio 12 2013"
open "build\open62541.sln" in Visual Studio 2013 and build as usual

Windows (MinGW)

  • Execute the same steps as in the Visual Studio case. But instead of installing Visual Studio, get and install MinGW:
  • The cmake command changes to
<path-to>\cmake.exe .. -G "MinGW Makefiles"
  • Then run (still in the build folder)
<path-to>\mingw32-make.exe

Install pkg-config (for CMake)

Get expat

  • Start MinGW Installation Manager mingw-get.exe
  • Choose all Packages, mark mingw32-expat and install

Get the check unit testing framework

cd check-code
autoreconf --install
mount c:/<MinGW-path> /mingw
./configure --prefix=/mingw CC=mingw32-gcc
make
make install

About

An open-source communication stack implementation of IEC 62541 aka OPC UA (OPC Unified Architecture) licensed under LGPL + static linking exception.

Resources

License

Unknown, CC0-1.0 licenses found

Licenses found

Unknown
LICENSE
CC0-1.0
LICENSE-CC0

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C 92.6%
  • C++ 7.0%
  • JavaScript 0.4%