diff --git a/include/neuron/define.h b/include/neuron/define.h index 8c3837ba..004e92b5 100644 --- a/include/neuron/define.h +++ b/include/neuron/define.h @@ -53,7 +53,7 @@ #define NEU_MSG_MAX_SIZE 2048 #define NEU_TAG_META_LENGTH 20 -#define NEU_TAG_META_SIZE 8 +#define NEU_TAG_META_SIZE 32 #define NEU_LOG_LEVEL_DEBUG "debug" #define NEU_LOG_LEVEL_INFO "info" @@ -64,11 +64,13 @@ #define NEU_CID_LNCLASS_LEN 12 #define NEU_CID_LNTYPE_LEN 32 +#define NEU_CID_LNPREFIX_LEN 10 +#define NEU_CID_LNINST_LEN 2 #define NEU_CID_IED_NAME_LEN 32 #define NEU_CID_LDEVICE_LEN 32 #define NEU_CID_LNO_NAME_LEN 32 #define NEU_CID_LNO_TYPE_LEN 32 -#define NEU_CID_INST_LEN 32 +#define NEU_CID_INST_LEN 16 #define NEU_CID_SDI_NAME_LEN 16 #define NEU_CID_DO_NAME_LEN 32 #define NEU_CID_DO_ID_LEN 32 diff --git a/include/neuron/utils/cid.h b/include/neuron/utils/cid.h index 2b7ce764..75bb0151 100644 --- a/include/neuron/utils/cid.h +++ b/include/neuron/utils/cid.h @@ -62,6 +62,8 @@ typedef struct { typedef struct { char lnclass[NEU_CID_LNCLASS_LEN]; char lntype[NEU_CID_LNTYPE_LEN]; + char lnprefix[NEU_CID_LNPREFIX_LEN]; + char lninst[NEU_CID_LNINST_LEN]; cid_dataset_t *datasets; int n_datasets; diff --git a/src/parser/neu_json_rw.c b/src/parser/neu_json_rw.c index 2e3939fb..223a656b 100644 --- a/src/parser/neu_json_rw.c +++ b/src/parser/neu_json_rw.c @@ -157,14 +157,21 @@ int neu_json_encode_read_paginate_resp(void *json_object, void *param) } } + void *attributes_object = neu_json_encode_new(); for (int k = 0; k < p_tag->n_meta; k++) { - tag_elems[if_precision + 9 + k].name = p_tag->metas[k].name; - tag_elems[if_precision + 9 + k].t = p_tag->metas[k].t; - tag_elems[if_precision + 9 + k].v = p_tag->metas[k].value; + neu_json_elem_t meta_elem = { 0 }; + meta_elem.name = p_tag->metas[k].name; + meta_elem.t = p_tag->metas[k].t; + meta_elem.v = p_tag->metas[k].value; + neu_json_encode_field(attributes_object, &meta_elem, 1); } - tag_array = neu_json_encode_array(tag_array, tag_elems, - 9 + if_precision + p_tag->n_meta); + tag_elems[if_precision + 9].name = "attributes"; + tag_elems[if_precision + 9].t = NEU_JSON_OBJECT; + tag_elems[if_precision + 9].v.val_object = attributes_object; + + tag_array = + neu_json_encode_array(tag_array, tag_elems, 10 + if_precision); free(p_tag->datatag.name); free(p_tag->datatag.address); diff --git a/src/utils/cid.c b/src/utils/cid.c index ff264498..4fdc4332 100644 --- a/src/utils/cid.c +++ b/src/utils/cid.c @@ -181,9 +181,11 @@ void neu_cid_to_msg(char *driver, cid_t *cid, neu_req_add_gtag_t *cmd) tag->address = calloc(1, NEU_TAG_ADDRESS_LEN); tag->description = strdup(""); snprintf(tag->address, NEU_TAG_ADDRESS_LEN - 1, - "%s%s/%s$%s$%s$%s", cid->ied.name, + "%s%s/%s%s%s$%s$%s$%s", cid->ied.name, cid->ied.ldevices[i].inst, - cid->ied.ldevices[i].lns[j].lnclass, "CO", + cid->ied.ldevices[i].lns[j].lnprefix, + cid->ied.ldevices[i].lns[j].lnclass, + cid->ied.ldevices[i].lns[j].lninst, "CO", cid->ied.ldevices[i].lns[j].ctrls[k].do_name, cid->ied.ldevices[i].lns[j].ctrls[k].sdi_name); } @@ -391,11 +393,28 @@ static int parse_lnode(xmlNode *xml_ldevice, cid_ldevice_t *ldev, (char *) xmlGetProp(lnode, (const xmlChar *) "lnClass"); char *ln_type = (char *) xmlGetProp(lnode, (const xmlChar *) "lnType"); + char *ln_prefix = + (char *) xmlGetProp(lnode, (const xmlChar *) "prefix"); + if (NULL == ln_prefix) { + ln_prefix = strdup(""); + } + + char *ln_inst = + (char *) xmlGetProp(lnode, (const xmlChar *) "inst"); + if (NULL == ln_inst) { + ln_inst = strdup(""); + } + if (strlen(ln_class) >= NEU_CID_LNCLASS_LEN || - strlen(ln_type) >= NEU_CID_LNTYPE_LEN) { + strlen(ln_type) >= NEU_CID_LNTYPE_LEN || + strlen(ln_prefix) >= NEU_CID_LNPREFIX_LEN || + strlen(ln_inst) >= NEU_CID_LNINST_LEN) { xmlFree(ln_class); xmlFree(ln_type); - nlog_warn("LN class/type is too long %d", (int) lnode->line); + xmlFree(ln_prefix); + xmlFree(ln_inst); + nlog_warn("LN class/type/prefix/inst is too long %d", + (int) lnode->line); return -1; } else { ldev->n_lns += 1; @@ -412,8 +431,12 @@ static int parse_lnode(xmlNode *xml_ldevice, cid_ldevice_t *ldev, strcpy(ln->lnclass, ln_class); strcpy(ln->lntype, ln_type); + strcpy(ln->lnprefix, ln_prefix); + strcpy(ln->lninst, ln_inst); xmlFree(ln_class); xmlFree(ln_type); + xmlFree(ln_prefix); + xmlFree(ln_inst); xmlNode *child = lnode->children; while (child != NULL) {