123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
- #ifndef UA_SERVER_PUBSUB_H
- #define UA_SERVER_PUBSUB_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include "ua_server.h"
- /**
- * .. _pubsub:
- *
- * Publish/Subscribe
- * =================
- *
- * Work in progress!
- * This part will be a new chapter later.
- *
- * TODO: write general PubSub introduction
- *
- * The Publish/Subscribe (PubSub) extension for OPC UA enables fast and efficient
- * 1:m communication. The PubSub extension is protocol agnostic and can be used
- * with broker based protocols like MQTT and AMQP or brokerless implementations like UDP-Multicasting.
- *
- * The PubSub API uses the following scheme:
- *
- * 1. Create a configuration for the needed PubSub element.
- *
- * 2. Call the add[element] function and pass in the configuration.
- *
- * 3. The add[element] function returns the unique nodeId of the internally created element.
- *
- * Take a look on the PubSub Tutorials for mor details about the API usage.::
- *
- * +-----------+
- * | UA_Server |
- * +-----------+
- * | |
- * | |
- * | |
- * | | +----------------------+
- * | +->| UA_PubSubConnections | UA_Server_addPubSubConnection
- * | +----------------------+
- * | | |
- * | | | +-----------------------+
- * | | +--->| UA_PubSubWriterGroups |
- * | | +-----------------------+
- * | |
- * | | +-----------------------+
- * | +-------->| UA_PubSubReaderGroups |
- * | +-----------------------+
- * |
- * | +---------------------------+
- * +------>| UA_PubSubPublishedDataSet | UA_Server_addPublishedDataSet
- * +---------------------------+
- *
- * Connections
- * -----------
- * The PubSub connections are the abstraction between the concrete transport protocol
- * and the PubSub functionality. It is possible to create multiple connections with
- * different transport protocols at runtime.
- *
- * Take a look on the PubSub Tutorials for mor details about the API usage.
- * Connections
- * -----------
- */
- typedef struct{
- UA_String name;
- UA_Boolean enabled;
- union{ //std: valid types UInt or String
- UA_UInt32 numeric;
- UA_String string;
- }publisherId;
- UA_String transportProfileUri;
- UA_Variant address;
- size_t connectionPropertiesSize;
- UA_KeyValuePair *connectionProperties;
- UA_Variant connectionTransportSettings;
- } UA_PubSubConnectionConfig;
- /**
- * Connection handling
- * ^^^^^^^^^^^^^^^^^^^
- */
- UA_StatusCode
- UA_Server_addPubSubConnection(UA_Server *server, const UA_PubSubConnectionConfig *connectionConfig,
- UA_NodeId *connectionIdentifier);
- UA_StatusCode
- UA_Server_removePubSubConnection(UA_Server *server, UA_NodeId connectionIdentifier);
- UA_StatusCode
- UA_PubSubConnection_getConfig(UA_Server *server, UA_NodeId connectionIdentifier,
- UA_PubSubConnectionConfig *config);
- /**
- * PublishedDataSets
- * -----------------
- * The PublishedDataSets (PDS) are containers for the published information. The PDS contain
- * the published variables and meta informations. The metainformations are commonly autogenerated
- * or given as constant argument as part of the template functions. The template functions are standard
- * defined and should only be used for configuration tools. You should normally
- * create a empty PDS and call the functions to add new fields.
- */
- typedef struct {
- UA_StatusCode addResult;
- size_t fieldAddResultsSize;
- UA_StatusCode *fieldAddResults;
- UA_ConfigurationVersionDataType configurationVersion;
- } UA_AddPublishedDataSetResult;
- typedef enum {
- UA_PUBSUB_DATASET_PUBLISHEDITEMS,
- UA_PUBSUB_DATASET_PUBLISHEDEVENTS,
- UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE,
- UA_PUBSUB_DATASET_PUBLISHEDEVENTS_TEMPLATE,
- } UA_PublishedDataSetType;
- /* The UA_PUBSUB_DATASET_PUBLISHEDITEMS has currently no additional members
- * and thus no dedicated config structure.
- */
- typedef struct {
- UA_DataSetMetaDataType metaData;
- size_t variablesToAddSize;
- UA_PublishedVariableDataType *variablesToAdd;
- } UA_PublishedDataItemsTemplateConfig;
- typedef struct {
- UA_NodeId eventNotfier;
- UA_ContentFilter filter;
- } UA_PublishedEventConfig;
- typedef struct {
- UA_DataSetMetaDataType metaData;
- UA_NodeId eventNotfier;
- size_t selectedFieldsSize;
- UA_SimpleAttributeOperand *selectedFields;
- UA_ContentFilter filter;
- } UA_PublishedEventTemplateConfig;
- /* Configuration structure for PubSubDataSet */
- typedef struct {
- UA_String name;
- UA_PublishedDataSetType publishedDataSetType;
- union{
- /* The UA_PUBSUB_DATASET_PUBLISHEDITEMS has currently no additional members
- * and thus no dedicated config structure.*/
- UA_PublishedDataItemsTemplateConfig itemsTemplate;
- UA_PublishedEventConfig event;
- UA_PublishedEventTemplateConfig eventTemplate;
- } config;
- } UA_PublishedDataSetConfig;
- /**
- * PublishedDataSet handling
- * ^^^^^^^^^^^^^^^^^^^^^^^^^
- */
- UA_AddPublishedDataSetResult
- UA_Server_addPublishedDataSet(UA_Server *server, const UA_PublishedDataSetConfig *publishedDataSetConfig,
- UA_NodeId *pdsIdentifier);
- UA_StatusCode
- UA_Server_removePublishedDataSet(UA_Server *server, UA_NodeId pdsIdentifier);
- UA_StatusCode
- UA_PublishedDataSet_getConfig(UA_Server *server, UA_NodeId publishedDataSetIdentifier,
- UA_PublishedDataSetConfig *config);
- void
- UA_PublishedDataSetConfig_deleteMembers(UA_PublishedDataSetConfig *pdsConfig);
- #ifdef __cplusplus
- } // extern "C"
- #endif
- #endif /* UA_SERVER_PUBSUB_H */
|