| /* 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 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) |
| * Copyright 2014, 2017 (c) Florian Palm |
| * Copyright 2015-2016 (c) Sten GrĂ¼ner |
| * Copyright 2015 (c) Chris Iatrou |
| * Copyright 2015-2016 (c) Oleksiy Vasylyev |
| * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH |
| * Copyright 2017 (c) Julian Grothoff |
| */ |
| |
| #ifndef UA_DISCOVERY_MANAGER_H_ |
| #define UA_DISCOVERY_MANAGER_H_ |
| |
| #include <open62541/server.h> |
| |
| #include "open62541_queue.h" |
| |
| _UA_BEGIN_DECLS |
| |
| #ifdef UA_ENABLE_DISCOVERY |
| |
| typedef struct registeredServer_list_entry { |
| #if UA_MULTITHREADING >= 200 |
| UA_DelayedCallback delayedCleanup; |
| #endif |
| LIST_ENTRY(registeredServer_list_entry) pointers; |
| UA_RegisteredServer registeredServer; |
| UA_DateTime lastSeen; |
| } registeredServer_list_entry; |
| |
| struct PeriodicServerRegisterCallback { |
| UA_UInt64 id; |
| UA_Double this_interval; |
| UA_Double default_interval; |
| UA_Boolean registered; |
| struct UA_Client* client; |
| char* discovery_server_url; |
| }; |
| |
| typedef struct periodicServerRegisterCallback_entry { |
| #if UA_MULTITHREADING >= 200 |
| UA_DelayedCallback delayedCleanup; |
| #endif |
| LIST_ENTRY(periodicServerRegisterCallback_entry) pointers; |
| struct PeriodicServerRegisterCallback *callback; |
| } periodicServerRegisterCallback_entry; |
| |
| #ifdef UA_ENABLE_DISCOVERY_MULTICAST |
| |
| #include "mdnsd/libmdnsd/mdnsd.h" |
| |
| /** |
| * TXT record: |
| * [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,... |
| * |
| * A/AAAA record for all ip addresses: |
| * [servername]-[hostname]._opcua-tcp._tcp.local. A [ip]. |
| * [hostname]. A [ip]. |
| */ |
| |
| typedef struct serverOnNetwork_list_entry { |
| #if UA_MULTITHREADING >= 200 |
| UA_DelayedCallback delayedCleanup; |
| #endif |
| LIST_ENTRY(serverOnNetwork_list_entry) pointers; |
| UA_ServerOnNetwork serverOnNetwork; |
| UA_DateTime created; |
| UA_DateTime lastSeen; |
| UA_Boolean txtSet; |
| UA_Boolean srvSet; |
| char* pathTmp; |
| } serverOnNetwork_list_entry; |
| |
| #define SERVER_ON_NETWORK_HASH_PRIME 1009 |
| typedef struct serverOnNetwork_hash_entry { |
| serverOnNetwork_list_entry* entry; |
| struct serverOnNetwork_hash_entry* next; |
| } serverOnNetwork_hash_entry; |
| |
| #endif |
| |
| typedef struct { |
| LIST_HEAD(, periodicServerRegisterCallback_entry) periodicServerRegisterCallbacks; |
| LIST_HEAD(, registeredServer_list_entry) registeredServers; |
| size_t registeredServersSize; |
| UA_Server_registerServerCallback registerServerCallback; |
| void* registerServerCallbackData; |
| |
| # ifdef UA_ENABLE_DISCOVERY_MULTICAST |
| mdns_daemon_t *mdnsDaemon; |
| UA_SOCKET mdnsSocket; |
| UA_Boolean mdnsMainSrvAdded; |
| |
| LIST_HEAD(, serverOnNetwork_list_entry) serverOnNetwork; |
| size_t serverOnNetworkSize; |
| |
| UA_UInt32 serverOnNetworkRecordIdCounter; |
| UA_DateTime serverOnNetworkRecordIdLastReset; |
| |
| /* hash mapping domain name to serverOnNetwork list entry */ |
| struct serverOnNetwork_hash_entry* serverOnNetworkHash[SERVER_ON_NETWORK_HASH_PRIME]; |
| |
| UA_Server_serverOnNetworkCallback serverOnNetworkCallback; |
| void* serverOnNetworkCallbackData; |
| |
| #if UA_MULTITHREADING >= 200 |
| pthread_t mdnsThread; |
| UA_Boolean mdnsRunning; |
| # endif |
| # endif /* UA_ENABLE_DISCOVERY_MULTICAST */ |
| } UA_DiscoveryManager; |
| |
| void UA_DiscoveryManager_init(UA_DiscoveryManager *dm, UA_Server *server); |
| void UA_DiscoveryManager_deleteMembers(UA_DiscoveryManager *dm, UA_Server *server); |
| |
| /* Checks if a registration timed out and removes that registration. |
| * Should be called periodically in main loop */ |
| void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic); |
| |
| #ifdef UA_ENABLE_DISCOVERY_MULTICAST |
| |
| void |
| UA_Server_updateMdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName, |
| const UA_MdnsDiscoveryConfiguration *mdnsConfig, |
| const UA_String *discoveryUrl, |
| UA_Boolean isOnline, UA_Boolean updateTxt); |
| |
| void mdns_record_received(const struct resource *r, void *data); |
| |
| void mdns_create_txt(UA_Server *server, const char *fullServiceDomain, |
| const char *path, const UA_String *capabilites, |
| const size_t capabilitiesSize, |
| void (*conflict)(char *host, int type, void *arg)); |
| |
| void mdns_set_address_record(UA_Server *server, |
| const char *fullServiceDomain, |
| const char *localDomain); |
| |
| mdns_record_t * |
| mdns_find_record(mdns_daemon_t *mdnsDaemon, unsigned short type, |
| const char *host, const char *rdname); |
| |
| void startMulticastDiscoveryServer(UA_Server *server); |
| |
| void stopMulticastDiscoveryServer(UA_Server *server); |
| |
| UA_StatusCode |
| iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat, |
| UA_Boolean processIn); |
| |
| typedef enum { |
| UA_DISCOVERY_TCP, /* OPC UA TCP mapping */ |
| UA_DISCOVERY_TLS /* OPC UA HTTPS mapping */ |
| } UA_DiscoveryProtocol; |
| |
| /* Send a multicast probe to find any other OPC UA server on the network through mDNS. */ |
| UA_StatusCode |
| UA_Discovery_multicastQuery(UA_Server* server); |
| |
| UA_StatusCode |
| UA_Discovery_addRecord(UA_Server *server, const UA_String *servername, |
| const UA_String *hostname, UA_UInt16 port, |
| const UA_String *path, const UA_DiscoveryProtocol protocol, |
| UA_Boolean createTxt, const UA_String* capabilites, |
| const size_t capabilitiesSize); |
| UA_StatusCode |
| UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername, |
| const UA_String *hostname, UA_UInt16 port, |
| UA_Boolean removeTxt); |
| |
| #endif /* UA_ENABLE_DISCOVERY_MULTICAST */ |
| |
| #endif /* UA_ENABLE_DISCOVERY */ |
| |
| _UA_END_DECLS |
| |
| #endif /* UA_DISCOVERY_MANAGER_H_ */ |