diff --git a/src/OpcUaWebServer/WebGateway/Client.cpp b/src/OpcUaWebServer/WebGateway/Client.cpp index 6541f45..a62903d 100644 --- a/src/OpcUaWebServer/WebGateway/Client.cpp +++ b/src/OpcUaWebServer/WebGateway/Client.cpp @@ -1078,4 +1078,226 @@ namespace OpcUaWebServer monitoredItemService_->asyncSend(trx); } + // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ + // + // node management service + // + // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ + bool + Client::initNodeManagementService(const MessageResponseCallback& messageResponseCallback) + { + if (!nodeManagementService_) { + NodeManagementServiceConfig nodeManagementServiceConfig; + nodeManagementServiceConfig.ioThreadName(ioThread_->name()); + nodeManagementServiceConfig.nodeManagementServiceName_ = std::string("NodeManagementService_") + UniqueId::createStringUniqueId(); + nodeManagementService_ = serviceSetManager_.nodeManagementService(sessionService_, nodeManagementServiceConfig); + if (!nodeManagementService_) { + Log(Error, "node management service error") + .parameter("Id", id_); + boost::property_tree::ptree responseBody; + messageResponseCallback(BadResourceUnavailable, responseBody); + return false; + } + } + return true; + } + + void + Client::addNodes( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ) + { + Log(Debug, "receive add nodes request") + .parameter("Id", id_); + + // create node management service if not exist + if (!initNodeManagementService(messageResponseCallback)) return; + + // decode add nodes request from web socket + auto trx = boost::make_shared(); + trx->requestTimeout(requestInfo.requestTimeout()); + auto req = trx->request(); + if (!req->jsonDecode(requestBody)) { + Log(Error, "decode add nodes request error") + .parameter("Id", id_); + boost::property_tree::ptree responseBody; + messageResponseCallback(BadInvalidArgument, responseBody); + return; + } + + // send add nodes request to opc ua server + trx->resultHandler( + [this, messageResponseCallback](ServiceTransactionAddNodes::SPtr& trx) { + boost::property_tree::ptree responseBody; + + // check status code + if (trx->statusCode() != Success) { + messageResponseCallback(trx->statusCode(), responseBody); + return; + } + + // encode call response + auto res = trx->response(); + if (!res->jsonEncode(responseBody)) { + messageResponseCallback(BadDeviceFailure, responseBody); + return; + } + + messageResponseCallback(Success, responseBody); + } + ); + nodeManagementService_->asyncSend(trx); + } + + void + Client::addReferences( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ) + { + Log(Debug, "receive add references request") + .parameter("Id", id_); + + // create node management service if not exist + if (!initNodeManagementService(messageResponseCallback)) return; + + // decode add references request from web socket + auto trx = boost::make_shared(); + trx->requestTimeout(requestInfo.requestTimeout()); + auto req = trx->request(); + if (!req->jsonDecode(requestBody)) { + Log(Error, "decode add references request error") + .parameter("Id", id_); + boost::property_tree::ptree responseBody; + messageResponseCallback(BadInvalidArgument, responseBody); + return; + } + + // send add references request to opc ua server + trx->resultHandler( + [this, messageResponseCallback](ServiceTransactionAddReferences::SPtr& trx) { + boost::property_tree::ptree responseBody; + + // check status code + if (trx->statusCode() != Success) { + messageResponseCallback(trx->statusCode(), responseBody); + return; + } + + // encode call response + auto res = trx->response(); + if (!res->jsonEncode(responseBody)) { + messageResponseCallback(BadDeviceFailure, responseBody); + return; + } + + messageResponseCallback(Success, responseBody); + } + ); + nodeManagementService_->asyncSend(trx); + } + + void + Client::deleteNodes( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ) + { + Log(Debug, "receive delete nodes request") + .parameter("Id", id_); + + // create node management service if not exist + if (!initNodeManagementService(messageResponseCallback)) return; + + // decode delete nodes request from web socket + auto trx = boost::make_shared(); + trx->requestTimeout(requestInfo.requestTimeout()); + auto req = trx->request(); + if (!req->jsonDecode(requestBody)) { + Log(Error, "decode delete nodes request error") + .parameter("Id", id_); + boost::property_tree::ptree responseBody; + messageResponseCallback(BadInvalidArgument, responseBody); + return; + } + + // send delete nodes request to opc ua server + trx->resultHandler( + [this, messageResponseCallback](ServiceTransactionDeleteNodes::SPtr& trx) { + boost::property_tree::ptree responseBody; + + // check status code + if (trx->statusCode() != Success) { + messageResponseCallback(trx->statusCode(), responseBody); + return; + } + + // encode call response + auto res = trx->response(); + if (!res->jsonEncode(responseBody)) { + messageResponseCallback(BadDeviceFailure, responseBody); + return; + } + + messageResponseCallback(Success, responseBody); + } + ); + nodeManagementService_->asyncSend(trx); + } + + void + Client::deleteReferences( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ) + { + Log(Debug, "receive add nodes request") + .parameter("Id", id_); + + // create node management service if not exist + if (!initNodeManagementService(messageResponseCallback)) return; + + // decode delete references request from web socket + auto trx = boost::make_shared(); + trx->requestTimeout(requestInfo.requestTimeout()); + auto req = trx->request(); + if (!req->jsonDecode(requestBody)) { + Log(Error, "decode delete references request error") + .parameter("Id", id_); + boost::property_tree::ptree responseBody; + messageResponseCallback(BadInvalidArgument, responseBody); + return; + } + + // send delete references request to opc ua server + trx->resultHandler( + [this, messageResponseCallback](ServiceTransactionDeleteReferences::SPtr& trx) { + boost::property_tree::ptree responseBody; + + // check status code + if (trx->statusCode() != Success) { + messageResponseCallback(trx->statusCode(), responseBody); + return; + } + + // encode call response + auto res = trx->response(); + if (!res->jsonEncode(responseBody)) { + messageResponseCallback(BadDeviceFailure, responseBody); + return; + } + + messageResponseCallback(Success, responseBody); + } + ); + nodeManagementService_->asyncSend(trx); + } + } diff --git a/src/OpcUaWebServer/WebGateway/Client.h b/src/OpcUaWebServer/WebGateway/Client.h index 3b0f037..bd71b2a 100644 --- a/src/OpcUaWebServer/WebGateway/Client.h +++ b/src/OpcUaWebServer/WebGateway/Client.h @@ -161,6 +161,30 @@ namespace OpcUaWebServer const MessageResponseCallback& messageResponseCallback ); + // + // node management service + // + void addNodes( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ); + void addReferences( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ); + void deleteNodes( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ); + void deleteReferences( + const RequestInfo& requestInfo, + boost::property_tree::ptree& requestBody, + const MessageResponseCallback& messageResponseCallback + ); + private: void logoutComplete(void); bool initViewService(const MessageResponseCallback& messageResponseCallback); @@ -168,6 +192,7 @@ namespace OpcUaWebServer bool initMethodService(const MessageResponseCallback& messageResponseCallback); bool initSubscriptionService(const MessageResponseCallback& messageResponseCallback); bool initMonitoredItemService(const MessageResponseCallback& messageResponseCallback); + bool initNodeManagementService(const MessageResponseCallback& messageResponseCallback); static uint32_t gId_; uint32_t id_; @@ -195,6 +220,7 @@ namespace OpcUaWebServer OpcUaStackClient::MethodService::SPtr methodService_; OpcUaStackClient::SubscriptionService::SPtr subscriptionService_; OpcUaStackClient::MonitoredItemService::SPtr monitoredItemService_; + OpcUaStackClient::NodeManagementService::SPtr nodeManagementService_; }; } diff --git a/src/OpcUaWebServer/WebGateway/ClientManager.cpp b/src/OpcUaWebServer/WebGateway/ClientManager.cpp index affe8c5..7c0a96c 100644 --- a/src/OpcUaWebServer/WebGateway/ClientManager.cpp +++ b/src/OpcUaWebServer/WebGateway/ClientManager.cpp @@ -1,5 +1,5 @@ /* - Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) + Copyright 2019-2021 Kai Huebl (kai@huebl-sgh.de) Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser Datei nur in Übereinstimmung mit der Lizenz erlaubt. @@ -490,6 +490,22 @@ namespace OpcUaWebServer client->deleteMonitoredItems(requestInfo, requestBody, messageResponseCallback); } + // + // node management service + // + else if (messageType == "GW_AddNodesRequest") { + client->addNodes(requestInfo, requestBody, messageResponseCallback); + } + else if (messageType == "GW_AddReferencesRequest") { + client->addReferences(requestInfo, requestBody, messageResponseCallback); + } + else if (messageType == "GW_DeleteNodesRequest") { + client->deleteNodes(requestInfo, requestBody, messageResponseCallback); + } + else if (messageType == "GW_DeleteReferencesRequest") { + client->deleteReferences(requestInfo, requestBody, messageResponseCallback); + } + // // error //