{"id":4039,"date":"2020-09-07T04:43:06","date_gmt":"2020-09-06T19:43:06","guid":{"rendered":"https:\/\/now0930.pe.kr\/wordpress\/?p=4039"},"modified":"2020-09-07T04:44:05","modified_gmt":"2020-09-06T19:44:05","slug":"open62541-method-call","status":"publish","type":"post","link":"https:\/\/now0930.pe.kr\/wordpress\/open62541-method-call\/","title":{"rendered":"open62541 method call"},"content":{"rendered":"\n<p>\ud29c\ud1a0\ub9ac\uc5bc\uc5d0 method call\uc774 \uc788\uc5b4 \ub530\ub77c \ud574\ubd24\ub2e4. method\ub97c \uc11c\ubc84\uc5d0 \uc124\uc815\ud558\uace0, client\uc5d0\uc11c \ubc18\uc751\uc744 \ubcf4\uace0 \uc2f6\uc5c8\ub294\ub370, \uc798 \uc548\ub42c\ub2e4. \ub450 \uc2dc\uac04 \uc0bd\uc9c8\ub9cc\uc5d0 UA_VARINT\uc5d0\uc11c UA_String\uc744 \ucd9c\ub825\ud588\ub2e4. \ucc98\uc74c\uc5d0\ub294 \ubab0\ub790\ub294\ub370 gdb\ub85c \uad6c\uc870\ub97c \ubcf4\uba74 \ub300\ub7b5 \uc54c \uc218 \uc788\ub2e4. UA_String\ub3c4 \uad6c\uc870\uccb4\ub77c data\uc640 length\ub85c \uad6c\uc131\ub41c\ub2e4. UA_Variant\ub85c data\ub97c \ucd9c\ub825\ud558\ub824\uba74 UA_String\uc73c\ub85c \uce90\uc2a4\ud305\ud558\uc5ec data\uc758 data\ub97c \ucc3e\uc544\uc57c \ud55c\ub2e4.&#8211;;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(gdb) \n45\t\t\/* Call a remote method *\/\n46\t\tUA_Variant input;\n47\t\tUA_String argString = UA_STRING(\"Hello Server\");\n48\t\tUA_Variant_init(&amp;input);\n49\t\t\/\/UA_Variant_setScalarCopy(&amp;input, &amp;argString, &amp;UA_TYPES[UA_TYPES_STRING]);\n50\t\tUA_Variant_setScalarCopy(&amp;input, &amp;argString, &amp;UA_TYPES[UA_TYPES_STRING]);\n51\t\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"input data is %s\\n\",(UA_String*)input.data);\n52\t\n53\t\tsize_t outputSize;\n54\t\tUA_Variant *output;\n(gdb) display input\n1: input = {type = 0xbefff4c8, storageType = (unknown: 3070066356), arrayLength = 0, data = 0xb6ffd13c, arrayDimensionsSize = 4, \n  arrayDimensions = 0xb6ffd14c}\n(gdb) n\n48\t\tUA_Variant_init(&amp;input);\n1: input = {type = 0xbefff4c8, storageType = (unknown: 3070066356), arrayLength = 0, data = 0xb6ffd13c, arrayDimensionsSize = 4, \n  arrayDimensions = 0xb6ffd14c}\n(gdb) print argString\n$1 = {length = 12, data = 0x10f0c \"Hello Server\"}\n(gdb) print argString->data\n$2 = (UA_Byte *) 0x10f0c \"Hello Server\"\n(gdb) n\n50\t\tUA_Variant_setScalarCopy(&amp;input, &amp;argString, &amp;UA_TYPES[UA_TYPES_STRING]);\n1: input = {type = 0x0, storageType = UA_VARIANT_DATA, arrayLength = 0, data = 0x0, arrayDimensionsSize = 0, arrayDimensions = 0x0}\n(gdb) n\n51\t\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"input data is %s\\n\",(UA_String*)input.data);\n1: input = {type = 0x22250 &lt;UA_TYPES+704>, storageType = UA_VARIANT_DATA, arrayLength = 0, data = 0x282d8, arrayDimensionsSize = 0, arrayDimensions = 0x0}\n(gdb) print input->data\n$3 = (void *) 0x282d8\n(gdb) print input->data->data\nAttempt to dereference a generic pointer.\n(gdb) print (UA_String*)(input->data)->data\nAttempt to dereference a generic pointer.\n(gdb) print (UA_String*)(input.data)->data\nAttempt to dereference a generic pointer.\n(gdb) display argString\n2: argString = {length = 12, data = 0x10f0c \"Hello Server\"}\n(gdb) display\n1: input = {type = 0x22250 &lt;UA_TYPES+704>, storageType = UA_VARIANT_DATA, arrayLength = 0, data = 0x282d8, arrayDimensionsSize = 0, arrayDimensions = 0x0}\n2: argString = {length = 12, data = 0x10f0c \"Hello Server\"}\n(gdb) display &amp;argString\n3: &amp;argString = (UA_String *) 0xbefff368<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[2020-09-07 04:29:15.352 (UTC+0900)] info\/userland\tinput data is Hello Server\ufffd\ufffd\nMethod call was successful, and 1 returned values available.\n[2020-09-07 04:29:15.352 (UTC+0900)] info\/userland\toutput data is Hello Hello Server\n[2020-09-07 04:29:15.353 (UTC+0900)] info\/client\tClient Status: ChannelState: Closed, SessionState: Closed, ConnectStatus: Good<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">int main(void) {\n    UA_Client *client = UA_Client_new();\n    UA_ClientConfig_setDefault(UA_Client_getConfig(client));\n    UA_StatusCode retval = UA_Client_connect(client, \"opc.tcp:\/\/localhost:4840\");\n\tprintf(\"retval is %d\\n\",retval);\n    if(retval != UA_STATUSCODE_GOOD) {\n        UA_Client_delete(client);\n        return (int)retval;\n    }\n    \/* Read attribute *\/\n    UA_Int32 value2 = 0;\n    printf(\"\\nReading the value of node (1, \\\"Test Var:Me\\\"):\\n\");\n    UA_Variant *val = UA_Variant_new();\n    retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, \"Test Var:Me\"), val);\n    if(retval == UA_STATUSCODE_GOOD &amp;&amp; UA_Variant_isScalar(val) &amp;&amp;\n\t\t\tval->type == &amp;UA_TYPES[UA_TYPES_INT32]) {\n\t\tvalue2 = *(UA_Int32*)val->data;\n\t\t\/\/printf(\"the value is: %i\\n\", value2);\n\t\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,\"myData is %d\",value2);\n\n\t}\n\n\t\/\/method call\n\n#ifdef UA_ENABLE_METHODCALLS\n\t\/* Call a remote method *\/\n\tUA_Variant input;\n\tUA_String argString = UA_STRING(\"Hello Server\");\n\tUA_Variant_init(&amp;input);\n\t\/\/UA_Variant_setScalarCopy(&amp;input, &amp;argString, &amp;UA_TYPES[UA_TYPES_STRING]);\n\tUA_Variant_setScalarCopy(&amp;input, &amp;argString, &amp;UA_TYPES[UA_TYPES_STRING]);\n\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"input data is %s\\n\",((UA_String*)input.data)->data);\n\tsize_t outputSize;\n\tUA_Variant *output;\n\tretval = UA_Client_call(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),\n\t\t\tUA_NODEID_NUMERIC(1, 62541), 1, &amp;input, &amp;outputSize, &amp;output);\n\n\tif(retval == UA_STATUSCODE_GOOD) {\n\t\tprintf(\"Method call was successful, and %lu returned values available.\\n\",\n\t\t\t\t(unsigned long)outputSize);\n\n\t\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"output data is %s\\n\",((UA_String*)output->data)->data);\n\n\t\tUA_Array_delete(output, outputSize, &amp;UA_TYPES[UA_TYPES_VARIANT]);\n\t} else {\n\t\tprintf(\"Method call was unsuccessful, and %x returned values available.\\n\", retval);\n\t}\n\tUA_Variant_clear(&amp;input);\n#endif\n\n\tUA_Variant_delete(val);\n\t\/* Clean up *\/\n\t\/\/\tUA_Variant_clear(&amp;value);\n\tUA_Variant_clear(&amp;value2);\n\n\tUA_Client_delete(client); \/* Disconnects the client internally *\/\n\treturn EXIT_SUCCESS;\n}\n\n<\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud29c\ud1a0\ub9ac\uc5bc\uc5d0 method call\uc774 \uc788\uc5b4 \ub530\ub77c \ud574\ubd24\ub2e4. method\ub97c \uc11c\ubc84\uc5d0 \uc124\uc815\ud558\uace0, client\uc5d0\uc11c \ubc18\uc751\uc744 \ubcf4\uace0 \uc2f6\uc5c8\ub294\ub370, \uc798 \uc548\ub42c\ub2e4. \ub450 \uc2dc\uac04 \uc0bd\uc9c8\ub9cc\uc5d0 UA_VARINT\uc5d0\uc11c UA_String\uc744 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12],"tags":[807,808,745,798],"class_list":["post-4039","post","type-post","status-publish","format-standard","hentry","category-12","tag-opcua","tag-open62541","tag-plc","tag-raspberry"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/comments?post=4039"}],"version-history":[{"count":1,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4039\/revisions"}],"predecessor-version":[{"id":4040,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4039\/revisions\/4040"}],"wp:attachment":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=4039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=4039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=4039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}