From 938efcfa0ba86d3ceeb81dc2fe7befc0bc5a2d8c Mon Sep 17 00:00:00 2001 From: fengzero Date: Thu, 22 Jan 2026 03:21:54 +0000 Subject: [PATCH 1/3] simulator: close fd --- include/neuron/connection/neu_connection.h | 1 + simulator/modbus_simulator.c | 6 ++++++ src/connection/connection.c | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/include/neuron/connection/neu_connection.h b/include/neuron/connection/neu_connection.h index fff4148b..1e9f855b 100644 --- a/include/neuron/connection/neu_connection.h +++ b/include/neuron/connection/neu_connection.h @@ -305,5 +305,6 @@ int is_ipv6(const char *ip); bool neu_conn_is_connected(neu_conn_t *conn); uint16_t neu_conn_udp_act_port(neu_conn_t *conn); +bool conn_tcp_server_is_listen(neu_conn_t *conn); #endif diff --git a/simulator/modbus_simulator.c b/simulator/modbus_simulator.c index 09ef3b07..a7996635 100644 --- a/simulator/modbus_simulator.c +++ b/simulator/modbus_simulator.c @@ -90,6 +90,7 @@ static void sig_handler(int sig) for (uint32_t i = 0; i < sizeof(c_events) / sizeof(struct client_event); i++) { if (c_events[i].fd > 0) { + close(c_events[i].fd); neu_event_del_io(events, c_events[i].client); } } @@ -149,6 +150,11 @@ int main(int argc, char *argv[]) events = neu_event_new("modbus_simulator"); conn = neu_conn_new(¶m, NULL, connected, disconnected); + while (conn_tcp_server_is_listen(conn) == false) { + neu_msleep(1000); + neu_conn_destory(conn); + conn = neu_conn_new(¶m, NULL, connected, disconnected); + } signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); diff --git a/src/connection/connection.c b/src/connection/connection.c index f4d05860..b37041e3 100644 --- a/src/connection/connection.c +++ b/src/connection/connection.c @@ -732,6 +732,11 @@ static void conn_init_param(neu_conn_t *conn, neu_conn_param_t *param) } } +bool conn_tcp_server_is_listen(neu_conn_t *conn) +{ + return conn->tcp_server.is_listen; +} + static void conn_tcp_server_listen(neu_conn_t *conn) { if (conn->param.type == NEU_CONN_TCP_SERVER && From 3086974da48e2b7f14f26807a32b7069deba634a Mon Sep 17 00:00:00 2001 From: fengzero Date: Thu, 22 Jan 2026 06:03:57 +0000 Subject: [PATCH 2/3] modbus tag address range --- plugins/modbus/modbus_point.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/modbus/modbus_point.c b/plugins/modbus/modbus_point.c index fd5fc1ae..e80edb4a 100644 --- a/plugins/modbus/modbus_point.c +++ b/plugins/modbus/modbus_point.c @@ -52,6 +52,10 @@ int modbus_tag_to_point(const neu_datatag_t *tag, modbus_point_t *point, return NEU_ERR_TAG_ADDRESS_FORMAT_INVALID; } + if (start_address > 65536) { + return NEU_ERR_TAG_ADDRESS_FORMAT_INVALID; + } + if (start_address == 65536 && address_base == 0) { point->start_address = 65535; } else if (start_address == 0 && address_base == 1) { From 0bca9e39a5cface1bca252539b03005019deccfe Mon Sep 17 00:00:00 2001 From: fengzero Date: Fri, 23 Jan 2026 02:41:59 +0000 Subject: [PATCH 3/3] export app: include static tags --- plugins/restful/global_config_handle.c | 11 +++++++++-- src/parser/neu_json_global_config.c | 14 ++++++++++++++ src/parser/neu_json_global_config.h | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/plugins/restful/global_config_handle.c b/plugins/restful/global_config_handle.c index 43d21a87..7ee2916c 100644 --- a/plugins/restful/global_config_handle.c +++ b/plugins/restful/global_config_handle.c @@ -1712,12 +1712,17 @@ static int get_app_subscriptions_resp(context_t * ctx, grps[index].driver = strdup(group->driver); grps[index].group = strdup(group->group); grps[index].params = group->params ? strdup(group->params) : NULL; + grps[index].static_tags = + group->static_tags ? strdup(group->static_tags) : NULL; if (NULL == grps[index].driver || NULL == grps[index].group) { for (int j = 0; j <= index; ++j) { free(grps[j].driver); free(grps[j].group); free(grps[j].params); + if (grps[j].static_tags) { + free(grps[j].static_tags); + } } free(grps); rv = NEU_ERR_EINTERNAL; @@ -1817,8 +1822,10 @@ static int add_app_subscription(context_t *ctx, neu_json_app_t *app, strcpy(cmd.app, app->node.name); strcpy(cmd.driver, grp->driver); strcpy(cmd.group, grp->group); - cmd.params = grp->params; - grp->params = NULL; + cmd.params = grp->params; + cmd.static_tags = grp->static_tags; + grp->params = NULL; + grp->static_tags = NULL; if (0 != neu_plugin_op(plugin, header, &cmd)) { return NEU_ERR_IS_BUSY; diff --git a/src/parser/neu_json_global_config.c b/src/parser/neu_json_global_config.c index b101fd72..402dcc6d 100644 --- a/src/parser/neu_json_global_config.c +++ b/src/parser/neu_json_global_config.c @@ -589,6 +589,9 @@ static void fini_app_group(neu_json_app_group_t *grp) free(grp->driver); free(grp->group); free(grp->params); + if (grp->static_tags) { + free(grp->static_tags); + } } int neu_json_encode_app(void *node_json, void *param) @@ -644,6 +647,15 @@ int neu_json_encode_app(void *node_json, void *param) } } + if (grp->static_tags && strlen(grp->static_tags) > 0) { + if (0 != + neu_json_load_key(grp_json, "static_tags", grp->static_tags, + false)) { + json_decref(grp_json); + return -1; + } + } + if (0 != json_array_append_new(groups_json, grp_json)) { return -1; } @@ -715,6 +727,8 @@ int neu_json_decode_app_json(void *node_json, neu_json_app_t *app_p) groups[i].driver = grp_elems[0].v.val_str; groups[i].group = grp_elems[1].v.val_str; neu_json_dump_key(grp_json, "params", &groups[i].params, false); + neu_json_dump_key(grp_json, "static_tags", &groups[i].static_tags, + false); } app_p->subscriptions.n_group = n_group; diff --git a/src/parser/neu_json_global_config.h b/src/parser/neu_json_global_config.h index cd811bf8..e907628b 100644 --- a/src/parser/neu_json_global_config.h +++ b/src/parser/neu_json_global_config.h @@ -101,6 +101,7 @@ typedef struct { char *driver; char *group; char *params; + char *static_tags; } neu_json_app_group_t; typedef struct {