Merge pull request #2268 from gc87/attributes

fix: support iec61850 data format
This commit is contained in:
fengzeroz
2024-11-11 13:46:16 +08:00
committed by GitHub
4 changed files with 45 additions and 11 deletions
+4 -2
View File
@@ -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
+2
View File
@@ -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;
+12 -5
View File
@@ -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);
+27 -4
View File
@@ -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) {