{"id":4020,"date":"2020-09-06T00:53:12","date_gmt":"2020-09-05T15:53:12","guid":{"rendered":"https:\/\/now0930.pe.kr\/wordpress\/?p=4020"},"modified":"2020-09-07T04:44:22","modified_gmt":"2020-09-06T19:44:22","slug":"open62541-server-client-variable-%ec%a0%84%eb%8b%ac","status":"publish","type":"post","link":"https:\/\/now0930.pe.kr\/wordpress\/open62541-server-client-variable-%ec%a0%84%eb%8b%ac\/","title":{"rendered":"open62541 server &#8211; client variable \uc804\ub2ec"},"content":{"rendered":"\n<p>tutorial\uc744 \uc5f4\uc2ec\ud788 \ub530\ub77c\ud588\uc9c0\ub9cc \ubcc0\uc218\ub97c \ucd94\uac00\ud558\ub2e4 \ub9c9\ud600 \ubabb\ud588\ub2e4. \ub0b4\uac00 OPC-UA \ud504\ub85c\ud1a0\ucf5c\uc744 \uc81c\ub300\ub85c \uc774\ud574\ud558\uc9c0 \ubabb\ud55c \ud0d3\uc774\ub2e4. \uc544\ub798\ub97c \ucc38\uc870\ud558\uc5ec \ubcc0\uc218\ub97c \uc11c\ubc84\uc5d0 \uac04\ub2e8\ud788 \ucd94\uac00\ud588\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/open62541.org\/doc\/current\/tutorial_server_variabletype.html\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1204\" height=\"660\" src=\"https:\/\/now0930.pe.kr\/wordpress\/wp-content\/uploads\/2020\/09\/Variable.png\" alt=\"\" class=\"wp-image-4024\" srcset=\"https:\/\/now0930.pe.kr\/wordpress\/wp-content\/uploads\/2020\/09\/Variable.png 1204w, https:\/\/now0930.pe.kr\/wordpress\/wp-content\/uploads\/2020\/09\/Variable-768x421.png 768w\" sizes=\"auto, (max-width: 1204px) 100vw, 1204px\" \/><\/figure>\n\n\n\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ubc84 \ubcc0\uc218\ub97c \uc77d\uc73c\ub824 \ud588\uc73c\ub098, \uc27d\uac8c \ud558\uc9c0 \ubabb\ud588\ub2e4. tutorial\uc774 \ud604\uc7ac \uc2dc\uac01\uc744 \uc27d\uac8c \ubcf4\uc5ec\uc918\uc11c \ub108\ubb34 \uc77c\ucc0d \uc2dc\uc791\ud558\uc600\ub2e4. callback \ud568\uc218\uae4c\uc9c0 \uc124\uc815\ud588\uc5b4\uc57c \ud588\ub294\ub370, \uc124\uba85\ud558\uc9c0 \uc54a\uc558\ub2e4. \ub108\ubb34 \ubd88\uce5c\uc808\ud558\ub2e4. \ub2e4\ud589\ud788\ub3c4 \uc88b\uc740 \ub3d9\uc601\uc0c1\uc744 \ubcf4\uace0 \uc774\ud574\ud588\ub2e4. \ub2e4\uc74c \uc7a5\uc5d0 \ub098\uc628 Connecting a Variable with a Physical Process \ud56d\ubaa9\uae4c\uc9c0 \uc77d\uace0 \ub530\ub77c \ud588\uc5b4\uc57c \ud588\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/open62541.org\/doc\/current\/tutorial_server_datasource.html\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Open62541 (OPC UA in C) Tutorial Add open62541 server&#039;s variables to a physical process (Part 4)\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/cRN_pxRB0EM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"open62541.h\"\n\n#include &lt;signal.h>\n#include &lt;stdlib.h>\n\nstatic volatile UA_Boolean running = true;\nstatic void stopHandler(int sig) {\n    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"received ctrl-c\");\n    running = false;\n}\n\n\nstatic void\naddVariable(UA_Server *server) {\n    \/* Define the attribute of the myInteger variable node *\/\n    UA_VariableAttributes attr = UA_VariableAttributes_default;\n    UA_Int32 myInteger = 42;\n    UA_Variant_setScalar(&amp;attr.value, &amp;myInteger, &amp;UA_TYPES[UA_TYPES_INT32]);\n    attr.description = UA_LOCALIZEDTEXT(\"en-US\",\"the answer\");\n    attr.displayName = UA_LOCALIZEDTEXT(\"en-US\",\"the answer\");\n    attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;\n    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;\n\n    \/* Add the variable node to the information model *\/\n    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, \"the.answer\");\n    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, \"the answer\");\n    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);\n    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);\n    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,\n                              parentReferenceNodeId, myIntegerName,\n                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL);\n}\n\nstatic void\nwriteVariable(UA_Server *server) {\n    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, \"the.answer\");\n\n    \/* Write a different integer value *\/\n    UA_Int32 myInteger = 43;\n    UA_Variant myVar;\n    UA_Variant_init(&amp;myVar);\n    UA_Variant_setScalar(&amp;myVar, &amp;myInteger, &amp;UA_TYPES[UA_TYPES_INT32]);\n    UA_Server_writeValue(server, myIntegerNodeId, myVar);\n\t \/* Set the status code of the value to an error code. The function\n     * UA_Server_write provides access to the raw service. The above\n     * UA_Server_writeValue is syntactic sugar for writing a specific node\n     * attribute with the write service. *\/\n    UA_WriteValue wv;\n    UA_WriteValue_init(&amp;wv);\n    wv.nodeId = myIntegerNodeId;\n    wv.attributeId = UA_ATTRIBUTEID_VALUE;\n    wv.value.status = UA_STATUSCODE_BADNOTCONNECTED;\n    wv.value.hasStatus = true;\n    UA_Server_write(server, &amp;wv);\n\n    \/* Reset the variable to a good statuscode with a value *\/\n    wv.value.hasStatus = false;\n    wv.value.value = myVar;\n    wv.value.hasValue = true;\n    UA_Server_write(server, &amp;wv);\n}\n\n\nstatic void\nwriteWrongVariable(UA_Server *server) {\n    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, \"the.answer\");\n\n    \/* Write a string *\/\n    UA_String myString = UA_STRING(\"test\");\n    UA_Variant myVar;\n    UA_Variant_init(&amp;myVar);\n    UA_Variant_setScalar(&amp;myVar, &amp;myString, &amp;UA_TYPES[UA_TYPES_STRING]);\n    UA_StatusCode retval = UA_Server_writeValue(server, myIntegerNodeId, myVar);\n    printf(\"Writing a string returned statuscode %s\\n\", UA_StatusCode_name(retval));\n}\n\nstatic void\nbeforeReadVal(UA_Server *server,\n               const UA_NodeId *sessionId, void *sessionContext,\n               const UA_NodeId *nodeid, void *nodeContext,\n               const UA_NumericRange *range, const UA_DataValue *data) {\n    \/\/updateCurrentTime(server);\n\tint tmpVal = rand()%1000;\n    UA_Variant value;\n    UA_Variant_setScalar(&amp;value, &amp;tmpVal, &amp;UA_TYPES[UA_TYPES_INT32]);\n    UA_NodeId currentNodeId = UA_NODEID_STRING(1, \"Test Var:Me\");\n    UA_Server_writeValue(server, currentNodeId, value);\n\t\n\n}\n\nint main(void) {\n    signal(SIGINT, stopHandler);\n    signal(SIGTERM, stopHandler);\n\n    UA_Server *server = UA_Server_new();\n    UA_ServerConfig_setDefault(UA_Server_getConfig(server));\n\t\/\/UA_ServerConfig* config = UA_Server_getConfig(server);\n\t\/\/config->verifyRequestTimestamp = UA_RULEHANDLING_ACCEPT;\n\n\t\/\/addVariable(server);\n\t\/\/writeVariable(server);\n\t\/\/writeWrongVariable(server);\n\n\n\t\/\/vendor, serial, variable \uc21c\uc73c\ub85c \ucd94\uac00.\n\n\t\/\/\uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9\ud560 \ubd80\ubd84 \uc124\uc815.\n\tUA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);\n\tUA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);\n\/\/\n\/\/\t\/\/vendor name \ucd94\uac00.\n\/\/\tUA_VariableAttributes vnAttr = UA_VariableAttributes_default;\n\/\/\tUA_String vendorName = UA_STRING(\"test vendor\");\n\/\/    UA_Variant_setScalar(&amp;vnAttr.value, &amp;vendorName, &amp;UA_TYPES[UA_TYPES_STRING]);\n\/\/    UA_NodeId vendorNodeId = UA_NODEID_STRING(1, \"Test VendorName:Me\");\n\/\/\tUA_QualifiedName myVendorName = UA_QUALIFIEDNAME(1, \"the answer\");\n\/\/    UA_Server_addVariableNode(server, vendorNodeId, parentNodeId,\n\/\/                              parentReferenceNodeId, myVendorName,\n\/\/                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vnAttr, NULL, NULL);\n\/\/\n\/\/\n\/\/\t\/\/serial no \ucd94\uac00.\n\/\/\tUA_VariableAttributes serialAttr = UA_VariableAttributes_default;\n\/\/\tUA_Int32 serialName = 123456;\n\/\/    UA_Variant_setScalar(&amp;serialAttr.value, &amp;serialName, &amp;UA_TYPES[UA_TYPES_INT32]);\n\/\/    UA_NodeId serialNodeId = UA_NODEID_STRING(1, \"Test serial:Me\");\n\/\/\tUA_QualifiedName mySerialName = UA_QUALIFIEDNAME(1, \"serial No\");\n\/\/    UA_Server_addVariableNode(server, serialNodeId, parentNodeId,\n\/\/                              parentReferenceNodeId, mySerialName,\n\/\/                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), serialAttr, NULL, NULL);\n\/\/\n\t\/\/variable \ucd94\uac00.\n\tUA_VariableAttributes varAttr = UA_VariableAttributes_default;\n\tUA_Int32 varName = 10;\n    UA_Variant_setScalar(&amp;varAttr.value, &amp;varName, &amp;UA_TYPES[UA_TYPES_INT32]);\n    UA_NodeId varNodeId = UA_NODEID_STRING(1, \"Test Var:Me\");\n\tUA_QualifiedName myVarName = UA_QUALIFIEDNAME(1, \"variable\");\n    UA_Server_addVariableNode(server, varNodeId, parentNodeId,\n                              parentReferenceNodeId, myVarName,\n                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), varAttr, NULL, NULL);\n\n\t\/\/add callback\n    UA_ValueCallback callback ;\n    callback.onRead = beforeReadVal;\n    callback.onWrite = NULL;\n\tUA_NodeId currentNodeId = UA_NODEID_STRING(1, \"Test Var:Me\");\n    UA_Server_setVariableNode_valueCallback(server, currentNodeId, callback);\n\n\n\t\/\/\uc11c\ubc84 \uad6c\ub3d9.\n\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"Starting server...\");\n    UA_StatusCode retval = UA_Server_run(server, &amp;running);\n\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"Shutdown server...\");\n\n\n    UA_Server_delete(server);\n    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;\n}\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"open62541.h\"\n\n#include &lt;stdlib.h>\n\nint 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\n    \/* Read the value attribute of the node. UA_Client_readValueAttribute is a\n     * wrapper for the raw read service available as UA_Client_Service_read. *\/\n\n\n\t\n\/\/    UA_Variant value; \/* Variants can hold scalar values and arrays of any type *\/\n\/\/    UA_Variant_init(&amp;value);\n\/\/\n\/\/    \/* NodeId of the variable holding the current time *\/\n\/\/    const UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);\n\/\/\tretval = UA_Client_readValueAttribute(client, nodeId, &amp;value);\n\/\/\tprintf(\"test\\n\");\n\/\/    if(retval == UA_STATUSCODE_GOOD &amp;&amp;\n\/\/       UA_Variant_hasScalarType(&amp;value, &amp;UA_TYPES[UA_TYPES_DATETIME])) {\n\/\/        UA_DateTime raw_date = *(UA_DateTime *) value.data;\n\/\/        UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);\n\/\/        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, \"date is: %u-%u-%u %u:%u:%u.%03u\\n\",\n\/\/                    dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);\n\/\/\n\/\/    }\n\/\/\n\t\/\/const UA_NodeId nodeId2 = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);\n\/\/\tconst UA_NodeId nodeId2 = UA_NODEID_STRING(1, \"the.answer\");\n\n\/\/\tUA_Variant value2;\n\/\/\tUA_Variant_init(&amp;value2);\n\/\/\tUA_Int32 node_value=0;\n\/\/\n\/\/\tretval = UA_Client_readValueAttribute(client, nodeId2, &amp;value2);\n\/\/\tif(retval == UA_STATUSCODE_GOOD &amp;&amp;\n\/\/\t\t\t\/\/UA_Variant_hasScalarType(&amp;value2, &amp;UA_TYPES[UA_TYPES_INT32])) {\n\/\/\t\t\tUA_Variant_isScalar(&amp;value2)) {\n\/\/\t\tUA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,\"myData is \");\n\/\/\n\/\/\t}\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\tprintf(\"retval is %d\\n\",retval);\n    retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, \"Test Var:Me\"), val);\n\tprintf(\"retval is %d\\n\",retval);\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\tUA_Variant_delete(val);\n\t\/* Clean up *\/\n\/\/\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}<\/pre>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"900\" style=\"aspect-ratio: 1600 \/ 900;\" width=\"1600\" controls src=\"https:\/\/now0930.pe.kr\/wordpress\/wp-content\/uploads\/2020\/09\/open62541_getValue-2020-09-06_00.47.05.mp4\"><\/video><\/figure>\n\n\n\n<p>\ub178\ub4dc ID, \ub370\uc774\ud130 \ud0c0\uc785 \ub4f1 \uae4c\ub2e4\ub86d\uac8c \ub9de\ucdb0\uc918\uc57c \ud55c\ub2e4. \ud2c0\ub9ac\uba74 \ubabb \uc77d\ub294\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>tutorial\uc744 \uc5f4\uc2ec\ud788 \ub530\ub77c\ud588\uc9c0\ub9cc \ubcc0\uc218\ub97c \ucd94\uac00\ud558\ub2e4 \ub9c9\ud600 \ubabb\ud588\ub2e4. \ub0b4\uac00 OPC-UA \ud504\ub85c\ud1a0\ucf5c\uc744 \uc81c\ub300\ub85c \uc774\ud574\ud558\uc9c0 \ubabb\ud55c \ud0d3\uc774\ub2e4. \uc544\ub798\ub97c \ucc38\uc870\ud558\uc5ec \ubcc0\uc218\ub97c \uc11c\ubc84\uc5d0 \uac04\ub2e8\ud788 \ucd94\uac00\ud588\ub2e4. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","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-4020","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\/4020","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=4020"}],"version-history":[{"count":4,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4020\/revisions"}],"predecessor-version":[{"id":4028,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4020\/revisions\/4028"}],"wp:attachment":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=4020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=4020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=4020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}