This is a fork of open62541, https://github.com/open62541/open62541

FlorianPalm 799ca40556 added "addReferences" service implementation (one-way references) 10 years ago
cmake d5cc1d3bb9 async networking with libuv 10 years ago
doc eb8855f48b improve documentation structure 10 years ago
examples 7aa7b32f89 Fix build on windows. 10 years ago
include 60b7e96aec Merge branch 'master' into external_datasource 10 years ago
src 799ca40556 added "addReferences" service implementation (one-way references) 10 years ago
tests c7e4629d1f fix unit tests 10 years ago
tools 7aa7b32f89 Fix build on windows. 10 years ago
.gitignore 9f6a679802 updated gitignore 10 years ago
.travis.yml e747d6526c use /doc instead of /doxygen for documentation on the homepage 10 years ago
AUTHORS c495d9b248 Update AUTHORS 10 years ago
CMakeLists.txt 7aa7b32f89 Fix build on windows. 10 years ago
LICENSE 9310d323c9 changed .gitignore again 11 years ago
LICENSE-CC0 f8265df738 clean up include structure 10 years ago
README.md b2f18c6ff3 Update README.md 10 years ago

README.md

open62541

open62541 (http://open62541.org) is an open-source implementation of OPC UA (OPC Unified Architecture) licensed under LGPL + static linking exception. The open62541 library can be used to build a dedicated OPC UA server or to integrate OPC UA-based communication into existing applications.

Ohloh Project Status Build Status Coverage Status Coverity Scan Build Status

The project is in an early stage but already usable. See below for a simple server implemenation that provides access to a single variable.

Documentation

The developer documentation is generated from Doxygen annotations in the source code: http://open62541.org/doc. Build instruction can be found under https://github.com/acplt/open62541/wiki/Building-open62541.

For discussion and help, you can use

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;
}