open62541 (http://open62541.org) は、C 言語で書かれた OPC UA (OPC Unified Architecture / IEC 62541) のオープンソース実装です。このライブラリはすべての主要なコンパイラで使用でき、専用の OPC UA クライアントおよびサーバーを実装したり、OPC UA ベースの通信を既存のアプリケーションに統合したりするために必要なツールを提供します。 open62541 ライブラリはプラットフォームに依存しません。すべてのプラットフォーム固有の機能は交換可能なプラグインを介して実装され、さまざまな (埋め込み) ターゲットに簡単に移植できます。
open62541 は、Mozilla Public License v2.0 (MPLv2) に基づいてライセンスされています。これにより、open62541 ライブラリを独自のソフトウェアと組み合わせて配布できるようになります。 open62541 ライブラリ自体への変更のみ、コピーおよび配布時に MPLv2 に基づいてライセンスを取得する必要があります。プラグイン、サーバーおよびクライアントのサンプルはパブリック ドメイン (CC0 ライセンス) にあります。これらは任意のライセンスの下で再利用でき、変更を公開する必要はありません。
このライブラリは、標準ソースとバイナリ形式で利用できます。さらに、単一ファイルのソース配布では、ライブラリ全体が単一の .c および .h ファイルにマージされ、既存のプロジェクトに簡単に追加できます。サーバーとクライアントの実装例は、/examples ディレクトリまたはこのページのさらに下にあります。
open62541 は、サーバー、クライアント、および PubSub (パブリッシュ/サブスクライブ) 通信をサポートする OPC UA SDK を実装します。詳細については、機能の概要をご覧ください。
open62541 は MPLv2 に基づいてライセンスされています。つまり、MPLv2 に基づくファイルへの変更は、同じオープンソース ライセンスに該当します。ただし、静的バイナリが生成される場合でも、ライセンスがプライベート ファイルに影響を与えることなく、ライブラリを別個のファイルからのプライベート開発と組み合わせることができます。詳細については、完全なライセンス文書を参照してください。
フラウンホーファー IOSB は、 open62541 開発者を数名採用し、商用サポートを提供しています。 open62541 エコシステムのその他のサービス プロバイダーは、open62541.org にリストされています。
open62541 v1.0 を使用して構築されたサンプル サーバー (server_ctt) は、OPC UA クライアント/サーバー通信、サブスクリプション、メソッド呼び出し、およびセキュリティ ポリシー「Basic128Rsa15」によるセキュリティ (暗号化) をサポートする OPC Foundation の「Micro Embedded Device Server」プロファイルに準拠しています。 '、'Basic256'、および 'Basic256Sha256'、およびファセット 'メソッド サーバー' および 'ノード 管理'。詳細については、https://open62541.org/certified-sdk を参照してください。
PubSub (UADP) は open62541 で実装されています。ただし、公式のテスト ケースとテスト ツールが不足しているため、現時点 (2019 年 9 月) ではこの機能を認定できません。
開発中は、OPC Foundation の適合テスト ツール (CTT) が定期的に適用されます。 CTT の構成と結果は https://github.com/open62541/open62541-ctt で追跡されます。 CTT で定期的にテストされている OPC UA プロファイルは現在次のとおりです。
OPC UA プロファイルを構成する適合単位のサポートの詳細については、open62541 機能のページを参照してください。
OPC UA と open62541 のドキュメントの概要については、http://open62541.org を参照してください。ライブラリの過去のリリースは、https://github.com/open62541/open62541/releases からダウンロードできます。
open62541 コミュニティ全体は、Github およびメーリング リストでのパブリック サポート リクエストを処理します。個別のディスカッションやサポートについては、次のチャネルを使用してください。
私たちはオープンで歓迎的なコミュニティを育みたいと考えています。当社の行動規範をご考慮ください。
open62541のビルド環境はCMake経由で生成されます。詳細については、ビルド ドキュメントを参照してください。既存のソフトウェア プロジェクトとの統合を簡素化するために、open62541 ソースを 1 つのファイル配布であるopen62541.c/.h
ファイルのペアに圧縮 (結合) できます。単一ファイルのディストリビューションに含まれる機能は、現在の CMake 構成によって異なります。
ソースコードは次のような構造になっています。
/include
): パブリック API は、open62541 を使用してアプリケーションに公開されます。プラグイン実装のヘッダーは/plugins/include
にあります。/src
): コア ライブラリには、C99 標準ヘッダー以外に依存関係はありません。/arch
): アーキテクチャ サポートは、 EventLoop
プラグインを介して実装されます。これにより、アーキテクチャ固有のコード (たとえば、POSIX API の使用) がコア ライブラリから除外されます。さまざまな (組み込み) アーキテクチャへのポートが提供されます。/plugins
): プラグイン インターフェイスを使用すると、さまざまなバックエンド システムおよびライブラリとの統合が可能になります。たとえば、暗号プリミティブ、情報モデルのストレージなどに関してです。デフォルトの実装が提供されます。/deps
): 一部の追加ライブラリは git サブモジュール経由で使用されるか、 deps/
フォルダーに内部化されています。サードパーティのライブラリとそれぞれのライセンスの詳細については、deps/README.md を参照してください。ほとんどのシステムでは、必要最低限の open62541 には C 標準ライブラリのみが必要です。ビルド構成に応じて、open62541 は暗号化用の mbedTLS や OpenSSL などの追加ライブラリに依存します。
オープンソース プロジェクトとして、新しい貢献者が open62541 の改善に協力することが奨励されています。 CONTRIBUTING.md ファイルには、コードの貢献に期待される優れた実践例がまとめられています。新しい貢献者にとって、次の点が良い出発点となります。
最終的に open62541 ライブラリの一部となるカスタム開発については、コア メンテナの 1 人を常に関与させてください。
私たちはコードの品質を重視します。次の品質指標は継続的にチェックされ、正式リリースが行われる前に維持されることが保証されます。
プロジェクトは脆弱性に対処するプロセスを確立しました。詳細と、責任を持って結果を管理者に開示する方法については、SECURITY.md を参照してください。
コード例は /examples ディレクトリにあります。サンプルをビルドするには、前のセクションで説明したように、open62541 をインストールすることをお勧めします。 GCC コンパイラーを使用すると、 gcc -std=c99
実行するだけです (Windows では、 ws2_32
ソケット ライブラリに対するリンクをさらに追加する必要がある場合があります)。
#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 ;
}