Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 222 additions & 0 deletions src/OpcUaWebServer/WebGateway/Client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<ServiceTransactionAddNodes>();
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<ServiceTransactionAddReferences>();
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<ServiceTransactionDeleteNodes>();
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<ServiceTransactionDeleteReferences>();
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);
}

}
26 changes: 26 additions & 0 deletions src/OpcUaWebServer/WebGateway/Client.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,13 +161,38 @@ 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);
bool initAttributeService(const MessageResponseCallback& messageResponseCallback);
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_;
Expand Down Expand Up @@ -195,6 +220,7 @@ namespace OpcUaWebServer
OpcUaStackClient::MethodService::SPtr methodService_;
OpcUaStackClient::SubscriptionService::SPtr subscriptionService_;
OpcUaStackClient::MonitoredItemService::SPtr monitoredItemService_;
OpcUaStackClient::NodeManagementService::SPtr nodeManagementService_;
};

}
Expand Down
18 changes: 17 additions & 1 deletion src/OpcUaWebServer/WebGateway/ClientManager.cpp
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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
//
Expand Down