diff --git a/plugins/modbus/modbus-tcp.json b/plugins/modbus/modbus-tcp.json index 52139973..1085044e 100644 --- a/plugins/modbus/modbus-tcp.json +++ b/plugins/modbus/modbus-tcp.json @@ -67,6 +67,25 @@ ] } }, + "check_header": { + "name": "Check Header", + "name_zh": "校验报文头", + "attribute": "required", + "type": "map", + "default": 0, + "valid": { + "map": [ + { + "key": "False", + "value": 0 + }, + { + "key": "True", + "value": 1 + } + ] + } + }, "max_retries": { "name": "Maximum Retry Times", "name_zh": "最大重试次数", diff --git a/plugins/modbus/modbus_req.h b/plugins/modbus/modbus_req.h index 03607527..838f4a61 100644 --- a/plugins/modbus/modbus_req.h +++ b/plugins/modbus/modbus_req.h @@ -43,6 +43,7 @@ struct neu_plugin { uint16_t interval; uint16_t retry_interval; uint16_t max_retries; + uint16_t check_header; }; void modbus_conn_connected(void *data, int fd); diff --git a/plugins/modbus/modbus_stack.c b/plugins/modbus/modbus_stack.c index ed1fcc4f..babcc6e6 100644 --- a/plugins/modbus/modbus_stack.c +++ b/plugins/modbus/modbus_stack.c @@ -77,6 +77,12 @@ int modbus_stack_recv(modbus_stack_t *stack, uint8_t slave_id, if (ret <= 0) { return -1; } + + neu_plugin_t *plugin = (neu_plugin_t *) stack->ctx; + if (plugin->check_header && header.seq + 1 != stack->read_seq && + header.seq + 1 != stack->write_seq) { + return -1; + } } ret = modbus_code_unwrap(buf, &code); diff --git a/plugins/modbus/modbus_tcp.c b/plugins/modbus/modbus_tcp.c index ba4e6c5b..7fa60f25 100644 --- a/plugins/modbus/modbus_tcp.c +++ b/plugins/modbus/modbus_tcp.c @@ -161,6 +161,8 @@ static int driver_config(neu_plugin_t *plugin, const char *config) neu_json_elem_t max_retries = { .name = "max_retries", .t = NEU_JSON_INT }; neu_json_elem_t retry_interval = { .name = "retry_interval", .t = NEU_JSON_INT }; + neu_json_elem_t check_header = { .name = "check_header", + .t = NEU_JSON_INT }; ret = neu_parse_param((char *) config, &err_param, 5, &port, &host, &mode, &timeout, &interval); @@ -189,10 +191,17 @@ static int driver_config(neu_plugin_t *plugin, const char *config) retry_interval.v.val_int = 0; } + ret = neu_parse_param((char *) config, &err_param, 1, &check_header); + if (ret != 0) { + free(err_param); + check_header.v.val_int = 0; + } + param.log = plugin->common.log; plugin->interval = interval.v.val_int; plugin->max_retries = max_retries.v.val_int; plugin->retry_interval = retry_interval.v.val_int; + plugin->check_header = check_header.v.val_int; if (mode.v.val_int == 1) { param.type = NEU_CONN_TCP_SERVER;