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

Stasik0 0ccd13bb77 implemented handling sockets that were closed by client, tnx to @FlorianPalm for some hints 10 년 전
cmake d5cc1d3bb9 async networking with libuv 10 년 전
doc 8ee327ac44 add introduction to UA to documentation. reset doxygen style until a more complete reskin is ready 10 년 전
examples 0ccd13bb77 implemented handling sockets that were closed by client, tnx to @FlorianPalm for some hints 10 년 전
include bda9cd58f5 update concurrent nodestore 10 년 전
ports 80f57754c7 fixing patch 10 년 전
src 8e4c7b9277 adding stateless features that can be turned on with EXTENSION_STATELESS 10 년 전
tests 44a443b54d fixing the handling of extension object, relates to #141 10 년 전
tools 2330e6e059 adding forgotten files 10 년 전
.gitignore 9f6a679802 updated gitignore 10 년 전
.travis.yml 5c710f99cb + Added an automatically check for the applicabililty of the patches 10 년 전
AUTHORS c495d9b248 Update AUTHORS 10 년 전
CMakeLists.txt 8e4c7b9277 adding stateless features that can be turned on with EXTENSION_STATELESS 10 년 전
LICENSE 9310d323c9 changed .gitignore again 11 년 전
LICENSE-CC0 f8265df738 clean up include structure 10 년 전
README.md 8ee327ac44 add introduction to UA to documentation. reset doxygen style until a more complete reskin is ready 10 년 전

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.

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

Ohloh Project Status Build Status Coverage Status Coverity Scan Build Status

Documentation

A general introduction to OPC UA and the open62541 documentation can be found at http://open62541.org/doc. Build instruction are here: https://github.com/acplt/open62541/wiki/Building-open62541.

For discussion and help, you can use

If open62541 is not fit for your needs, have a look at some other open source OPC UA implementations. Or even better, help us improving open62541 by sending bug reports/bugfixes on github or the mailing list!

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