Open82541 UA_Variant to String
Ich habe in letzter Zeit einige Projekte mit OPC UA und der freien Biblothek open62541 von open62541.org abgewickelt. Die Bibliothek wird aktiv betreut und kann mit ihren kommerziellen Konkurenten sehr gut mithalten, auch in produktiven Umgebungen.
Direktes Lesen und Konvertieren von Variablen in die C/C++ Equivalente ist sehr einfach möglich, nur Strings wollten nicht. Hintergrund ist, dass der Daten Pointer des variablen Datentype UA_Variant nicht Nullterminiert ist. Man muss deswegen ein neues String Objekt erzeugen und den Datenpointer inkl. Länger übergeben. Dann funktioniert es auch!
Für alle Open62541 User hier ein kurzes Beispiel, ohne das der eigentliche Datentyp explizit geprüft wird, damit das Beispiel kurz und verständlich bleibt.
#include <string>
#include "open62541.h"
std::string get_variable(UA_Client *client, int namespace_index, char *variable)
{
std::string ret;
UA_Variant *var;
UA_NodeId node_id;
UA_StatusCode status;
UA_String tmp_str;
node_id = UA_NODEID_STRING(namespace_index, variable);
status = UA_Client_readValueAttribute(client, node_id, var);
if(status == UA_STATUSCODE_GOOD)
{
tmp_str = *reinterpret_cast<UA_String*>(var->data);
ret = std::string(reinterpret_cast<char *>(tmp_str.data), tmp_str.length);
}
return ret;
}
Compilieren z.B. mit folgendem Befehl um eine Bibliothek zu erstellen:
g++ -c -o test test.c