Я новичок в opc, но мне нужно подключиться к серверу. мой коллега сказал мне, что на сервере нет политики безопасности и сертификата, только имя пользователя и пароль, он тоже с этим не знаком.
результат: введите сюда описание изображения
И я подключаюсь к серверу через UaExpert: введите сюда описание изображениявведите сюда описание изображения
есть мой код:
#include "open62541.h"
#include "ros/ros.h"
#include <iostream>
int main() {
UA_Client *client = UA_Client_new();
UA_ClientConfig *cc = UA_Client_getConfig(client);
UA_ClientConfig_setDefault(cc);
cc->securityMode = UA_MESSAGESECURITYMODE_NONE;
const char* serverurl = "opc.tcp://server_ip";
const char* username = "username";
const char* password = "123";
UA_StatusCode retval = UA_Client_connectUsername(client, serverurl, username, password);
if (retval != UA_STATUSCODE_GOOD) {
UA_Client_delete(client);
return EXIT_FAILURE;
}
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Connected!");
UA_Client_disconnect(client);
UA_Client_delete(client);
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}
я не могу найти решение, поэтому задаю вопрос Спасибо
Я заметил ту же проблему в сообщении в блоге, где, в отличие от моей ситуации, автор разработал собственный сервер. Итак, он проводит несколько тестов: На стороне сервера, если разрешена как анонимная аутентификация, так и аутентификация по имени пользователя и паролю, клиенты, использующие любой метод, могут успешно подключиться, когда конечная точка сервера установлена в незашифрованный режим (имея только «Нет» в качестве параметра безопасности). Однако после добавления зашифрованных конечных точек в конфигурацию сервера стало невозможно пройти аутентификацию по имени пользователя и паролю через незашифрованную («Нет») конечную точку.
его вывод был: При настройке политик безопасности шифрования сервер по умолчанию применяет самый строгий метод шифрования, что приводит к сбоям в подключении клиентов, пытающихся использовать незашифрованные режимы.
Приняв эту информацию во внимание, я попытался установить соединение с использованием шифрования.
cc->securityPolicyUri = UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#None");
cc->securityMode = UA_MESSAGESECURITYMODE_NONE;
затем загрузив сгенерированный клиентом сертификат и закрытый ключ, мне удалось подключиться к серверу посредством проверки имени пользователя и пароля. Это соединение не только разрешало доступ, но и позволяло изменять данные на сервере.
код:
bool open62541tool::connect()
{
UA_ByteString certificate = loadFile(cli.certs);
UA_ByteString privateKey = loadFile(cli.keys);
UA_ClientConfig *cc = UA_Client_getConfig(this->client);
cc->securityPolicyUri = UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#None");
cc->securityMode = UA_MESSAGESECURITYMODE_NONE;
UA_ClientConfig_setDefaultEncryption(cc, certificate, privateKey,0,0,0,0);
UA_SecurityPolicy_None(cc->securityPolicies, certificate, &cc->logger);
UA_String_deleteMembers(&cc->clientDescription.applicationUri);
cc->clientDescription.applicationUri = UA_STRING_ALLOC("urn:open62541.client.application");
UA_StatusCode retval = UA_Client_connect_username(this->client, cli.endpointUrl, cli.username, cli.password);
if (retval != UA_STATUSCODE_GOOD) {
return EXIT_FAILURE;
}
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_CLIENT, "#############!!!!##Connected################");
UA_ByteString_clear(&certificate);
UA_ByteString_clear(&privateKey);
return true;
}
Если с моим ответом возникнут какие-либо проблемы, я надеюсь, что каждый выскажет свое мнение.