open62541 (http://open62541.org) ist eine Open-Source-Implementierung von OPC UA (OPC Unified Architecture / IEC 62541), geschrieben in der Sprache C. Die Bibliothek ist mit allen gängigen Compilern nutzbar und stellt die notwendigen Werkzeuge bereit, um dedizierte OPC UA-Clients und -Server zu implementieren oder OPC UA-basierte Kommunikation in bestehende Anwendungen zu integrieren. Die open62541-Bibliothek ist plattformunabhängig: Alle plattformspezifischen Funktionen werden über austauschbare Plugins implementiert, um eine einfache Portierung auf verschiedene (eingebettete) Ziele zu ermöglichen.
open62541 ist unter der Mozilla Public License v2.0 (MPLv2) lizenziert. Dadurch kann die open62541-Bibliothek mit jeder proprietären Software kombiniert und verteilt werden. Nur Änderungen an der open62541-Bibliothek selbst müssen beim Kopieren und Verteilen unter der MPLv2 lizenziert werden. Die Plugins sowie die Server- und Client-Beispiele sind gemeinfrei (CC0-Lizenz). Sie können unter jeder Lizenz weiterverwendet werden und Änderungen müssen nicht veröffentlicht werden.
Die Bibliothek ist in Standard-Quell- und Binärform verfügbar. Darüber hinaus führt die Einzeldatei-Quellverteilung die gesamte Bibliothek in einer einzigen .c- und .h-Datei zusammen, die problemlos zu bestehenden Projekten hinzugefügt werden kann. Beispielhafte Server- und Client-Implementierungen finden Sie im Verzeichnis /examples oder weiter unten auf dieser Seite.
open62541 implementiert ein OPC UA SDK mit Unterstützung für Server, Clients und PubSub-Kommunikation (Publish-Subscribe). Ausführliche Informationen finden Sie in der Funktionsübersicht.
open62541 ist unter der MPLv2 lizenziert. Das heißt, Änderungen an Dateien unter MPLv2 fallen unter dieselbe Open-Source-Lizenz. Die Bibliothek kann jedoch mit der privaten Entwicklung aus separaten Dateien kombiniert werden, auch wenn eine statische Binärdatei erstellt wird, ohne dass die Lizenz Auswirkungen auf die privaten Dateien hat. Einzelheiten finden Sie im vollständigen Lizenzdokument.
Das Fraunhofer IOSB beschäftigt mehrere der open62541-Entwickler und bietet kommerziellen Support . Weitere Dienstanbieter im open62541-Ökosystem sind auf open62541.org aufgeführt.
Der mit open62541 v1.0 erstellte Beispielserver (server_ctt) entspricht dem „Micro Embedded Device Server“-Profil der OPC Foundation und unterstützt OPC UA-Client/Server-Kommunikation, Abonnements, Methodenaufrufe und Sicherheit (Verschlüsselung) mit den Sicherheitsrichtlinien „Basic128Rsa15 ', 'Basic256' und 'Basic256Sha256' und die Facetten 'Methodenserver' und 'Knotenverwaltung'. Weitere Informationen finden Sie unter https://open62541.org/certified-sdk.
PubSub (UADP) ist in open62541 implementiert. Allerdings kann die Funktion zum jetzigen Zeitpunkt (September 2019) nicht zertifiziert werden, da es an offiziellen Testfällen und Testtools mangelt.
Bei der Entwicklung kommen regelmäßig die Conformance Testing Tools (CTT) der OPC Foundation zum Einsatz. Die CTT-Konfiguration und -Ergebnisse werden unter https://github.com/open62541/open62541-ctt verfolgt. Die OPC UA-Profile, die im CTT regelmäßig getestet werden, sind derzeit:
Auf der Seite zu open62541-Funktionen finden Sie einen detaillierten Einblick in die Unterstützung der Konformitätseinheiten, aus denen die OPC UA-Profile bestehen.
Eine allgemeine Einführung in OPC UA und die open62541-Dokumentation finden Sie unter http://open62541.org. Frühere Versionen der Bibliothek können unter https://github.com/open62541/open62541/releases heruntergeladen werden.
Die gesamte open62541-Community bearbeitet öffentliche Supportanfragen auf Github und der Mailingliste. Für individuelle Gespräche und Unterstützung nutzen Sie folgende Kanäle:
Wir möchten eine offene und einladende Gemeinschaft fördern. Bitte beachten Sie unseren Verhaltenskodex.
Die Build-Umgebung von open62541 wird über CMake generiert. Weitere Informationen finden Sie in der Build-Dokumentation. Um die Integration in bestehende Softwareprojekte zu vereinfachen, können die open62541-Quellen in einer Einzeldatei-Distribution, einem Paar open62541.c/.h
Dateien, komprimiert (zusammengeführt) werden. Die in der Einzeldateiverteilung enthaltene Funktionalität hängt von der aktuellen CMake-Konfiguration ab.
Der Quellcode ist wie folgt aufgebaut:
/include
): Die öffentliche API wird für Anwendungen verfügbar gemacht, die open62541 verwenden. Die Header für Plugin-Implementierungen befinden sich in /plugins/include
./src
): Die Kernbibliothek hat außer den C99-Standardheadern keine Abhängigkeiten./arch
): Architekturunterstützung wird über das EventLoop
-Plugin implementiert. Dadurch wird der architekturspezifische Code – beispielsweise zur Nutzung der POSIX-APIs – aus der Kernbibliothek herausgehalten. Es werden Ports zu verschiedenen (eingebetteten) Architekturen bereitgestellt./plugins
): Die Plugin-Schnittstellen ermöglichen die Integration mit verschiedenen Backend-Systemen und Bibliotheken. Zum Beispiel bezüglich Kryptoprimitiven, Speicherung des Informationsmodells usw. Es werden Standardimplementierungen bereitgestellt./deps
): Einige zusätzliche Bibliotheken werden über Git-Submodule verwendet oder wurden im Ordner deps/
verinnerlicht. Weitere Informationen zu den Bibliotheken von Drittanbietern und ihren jeweiligen Lizenzen finden Sie in deps/README.mdAuf den meisten Systemen erfordert ein einfaches open62541 nur die C-Standardbibliothek. Abhängig von der Build-Konfiguration ist open62541 für die Verschlüsselung auf zusätzliche Bibliotheken wie mbedTLS oder OpenSSL angewiesen.
Da es sich um ein Open-Source-Projekt handelt, werden neue Mitwirkende ermutigt, zur Verbesserung von open62541 beizutragen. Die Datei CONTRIBUTING.md fasst bewährte Methoden zusammen, die wir für Codebeiträge erwarten. Die folgenden Punkte sind gute Ausgangspunkte für neue Mitwirkende:
Für benutzerdefinierte Entwicklungen, die schließlich Teil der open62541-Bibliothek werden sollen, halten Sie bitte einen der Hauptbetreuer auf dem Laufenden.
Wir legen Wert auf Codequalität. Die folgenden Qualitätsmetriken werden kontinuierlich überprüft und es wird sichergestellt, dass sie eingehalten werden, bevor eine offizielle Veröffentlichung erfolgt:
Das Projekt hat einen Prozess zum Umgang mit Schwachstellen etabliert. Weitere Informationen und Informationen zur verantwortungsvollen Offenlegung von Ergebnissen gegenüber den Betreuern finden Sie in SECURITY.md.
Codebeispiele finden Sie im Verzeichnis /examples. Um die Beispiele zu erstellen, empfehlen wir die Installation von open62541 wie im vorherigen Abschnitt erwähnt. Führen Sie mit dem GCC-Compiler einfach gcc -std=c99
aus (unter Windows müssen Sie möglicherweise einen zusätzlichen Link zur ws2_32
-Socket-Bibliothek hinzufügen).
#include
int main ( int argc , char * * argv )
{
/* Create a server listening on port 4840 (default) */
UA_Server * server = UA_Server_new ();
/* Add a variable node to the server */
/* 1) Define the variable attributes */
UA_VariableAttributes attr = UA_VariableAttributes_default ;
attr . displayName = UA_LOCALIZEDTEXT ( "en-US" , "the answer" );
UA_Int32 myInteger = 42 ;
UA_Variant_setScalar ( & attr . value , & myInteger , & UA_TYPES [ UA_TYPES_INT32 ]);
/* 2) Define where the node shall be added with which browsename */
UA_NodeId newNodeId = UA_NODEID_STRING ( 1 , "the.answer" );
UA_NodeId parentNodeId = UA_NS0ID ( OBJECTSFOLDER );
UA_NodeId parentReferenceNodeId = UA_NS0ID ( ORGANIZES );
UA_NodeId variableType = UA_NODEID_NULL ; /* take the default variable type */
UA_QualifiedName browseName = UA_QUALIFIEDNAME ( 1 , "the answer" );
/* 3) Add the node */
UA_Server_addVariableNode ( server , newNodeId , parentNodeId ,
parentReferenceNodeId , browseName ,
variableType , attr , NULL , NULL );
/* Run the server (until ctrl-c interrupt) */
UA_StatusCode status = UA_Server_runUntilInterrupt ( server );
/* Clean up */
UA_Server_delete ( server );
return status == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE ;
}
#include
#include
#include
int main ( int argc , char * argv [])
{
/* Create a client and connect */
UA_Client * client = UA_Client_new ();
UA_ClientConfig_setDefault ( UA_Client_getConfig ( client ));
UA_StatusCode status = UA_Client_connect ( client , "opc.tcp://localhost:4840" );
if ( status != UA_STATUSCODE_GOOD ) {
UA_Client_delete ( client );
return status ;
}
/* Read the value attribute of the node. UA_Client_readValueAttribute is a
* wrapper for the raw read service available as UA_Client_Service_read. */
UA_Variant value ; /* Variants can hold scalar values and arrays of any type */
UA_Variant_init ( & value );
status = UA_Client_readValueAttribute ( client , UA_NODEID_STRING ( 1 , "the.answer" ), & value );
if ( status == UA_STATUSCODE_GOOD &&
UA_Variant_hasScalarType ( & value , & UA_TYPES [ UA_TYPES_INT32 ])) {
printf ( "the value is: %in" , * ( UA_Int32 * ) value . data );
}
/* Clean up */
UA_Variant_clear ( & value );
UA_Client_delete ( client ); /* Disconnects the client internally */
return status == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE ;
}