From 5d29fb6a457910631b3d18a558099689069b512e Mon Sep 17 00:00:00 2001 From: "xiang.zhou" Date: Thu, 25 Jan 2024 14:42:36 +0800 Subject: [PATCH] feat(prgfile):add prgfile api --- include/neuron/msg.h | 26 ++++++++++++++++++++++++++ src/adapter/adapter.c | 22 +++++++++++++++++++++- src/base/msg_internal.h | 5 ++++- src/core/manager.c | 4 +++- tests/ft/neuron/api.py | 26 ++++++++++++++++++++++++-- tests/plugins/c1/c1_2.c | 7 +++++-- 6 files changed, 83 insertions(+), 7 deletions(-) diff --git a/include/neuron/msg.h b/include/neuron/msg.h index 66ba16f5..10cd8025 100644 --- a/include/neuron/msg.h +++ b/include/neuron/msg.h @@ -110,6 +110,10 @@ typedef enum neu_reqresp_type { NEU_REQ_UPDATE_LOG_LEVEL, + NEU_REQ_PRGFILE_UPLOAD, + NEU_REQ_PRGFILE_PROCESS, + NEU_RESP_PRGFILE_PROCESS, + } neu_reqresp_type_e; static const char *neu_reqresp_type_string_t[] = { @@ -182,6 +186,9 @@ static const char *neu_reqresp_type_string_t[] = { [NEU_REQ_ADD_DRIVERS] = "NEU_REQ_ADD_DRIVERS", [NEU_REQ_UPDATE_LOG_LEVEL] = "NEU_REQ_UPDATE_LOG_LEVEL", + [NEU_REQ_PRGFILE_UPLOAD] = "NEU_REQ_PRGFILE_UPLOAD", + [NEU_REQ_PRGFILE_PROCESS] = "NEU_REQ_PRGFILE_PROCESS", + [NEU_RESP_PRGFILE_PROCESS] = "NEU_RESP_PRGFILE_PROCESS", }; inline static const char *neu_reqresp_type_string(neu_reqresp_type_e type) @@ -894,6 +901,25 @@ inline static void neu_msg_exchange(neu_reqresp_head_t *header) strcpy(header->receiver, tmp); } +typedef struct { + char driver[NEU_NODE_NAME_LEN]; + char path[128]; + int prg_int_param1; + int prg_int_param2; + char prg_str_param1[128]; + char prg_str_param2[128]; +} neu_req_prgfile_upload_t; + +typedef struct { + char driver[NEU_NODE_NAME_LEN]; +} neu_req_prgfile_process_t; + +typedef struct { + char path[128]; + int state; + char reason[256]; +} neu_resp_prgfile_process_t; + #ifdef __cplusplus } #endif diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index d37f8d81..058fbf92 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -521,6 +521,20 @@ static int adapter_command(neu_adapter_t *adapter, neu_reqresp_head_t header, strcpy(pheader->receiver, cmd->node); break; } + case NEU_REQ_PRGFILE_UPLOAD: { + neu_req_prgfile_upload_t *cmd = (neu_req_prgfile_upload_t *) data; + strcpy(pheader->receiver, cmd->driver); + break; + } + case NEU_REQ_PRGFILE_PROCESS: { + neu_req_prgfile_process_t *cmd = (neu_req_prgfile_process_t *) data; + strcpy(pheader->receiver, cmd->driver); + break; + } + case NEU_RESP_PRGFILE_PROCESS: { + strcpy(pheader->receiver, DEFAULT_DASHBOARD_PLUGIN_NAME); + break; + } default: break; } @@ -697,6 +711,8 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) case NEU_RESP_GET_GROUP: case NEU_RESP_ERROR: case NEU_REQRESP_NODES_STATE: + case NEU_REQ_PRGFILE_PROCESS: + case NEU_RESP_PRGFILE_PROCESS: adapter->module->intf_funs->request( adapter->plugin, (neu_reqresp_head_t *) header, &header[1]); neu_msg_free(msg); @@ -1161,7 +1177,11 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } - + case NEU_REQ_PRGFILE_UPLOAD: { + adapter->module->intf_funs->request( + adapter->plugin, (neu_reqresp_head_t *) header, &header[1]); + break; + } default: nlog_warn("adapter: %s recv msg type error, type: %s", adapter->name, neu_reqresp_type_string(header->type)); diff --git a/src/base/msg_internal.h b/src/base/msg_internal.h index f8859396..0f772f00 100644 --- a/src/base/msg_internal.h +++ b/src/base/msg_internal.h @@ -89,7 +89,10 @@ extern "C" { XX(NEU_REQRESP_NODES_STATE, neu_reqresp_nodes_state_t) \ XX(NEU_REQRESP_NODE_DELETED, neu_reqresp_node_deleted_t) \ XX(NEU_REQ_ADD_DRIVERS, neu_req_driver_array_t) \ - XX(NEU_REQ_UPDATE_LOG_LEVEL, neu_req_update_log_level_t) + XX(NEU_REQ_UPDATE_LOG_LEVEL, neu_req_update_log_level_t) \ + XX(NEU_REQ_PRGFILE_UPLOAD, neu_req_prgfile_upload_t) \ + XX(NEU_REQ_PRGFILE_PROCESS, neu_req_prgfile_process_t) \ + XX(NEU_RESP_PRGFILE_PROCESS, neu_resp_prgfile_process_t) static inline size_t neu_reqresp_size(neu_reqresp_type_e t) { diff --git a/src/core/manager.c b/src/core/manager.c index ecf1a46d..d139736e 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -993,7 +993,8 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } - + case NEU_REQ_PRGFILE_PROCESS: + case NEU_REQ_PRGFILE_UPLOAD: case NEU_REQ_GET_NODE_STATE: { if (neu_node_manager_find(manager->node_manager, header->receiver) == NULL) { @@ -1187,6 +1188,7 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) case NEU_RESP_GET_NODE_SETTING: case NEU_RESP_ERROR: case NEU_RESP_READ_GROUP: + case NEU_RESP_PRGFILE_PROCESS: forward_msg(manager, header, header->receiver); break; diff --git a/tests/ft/neuron/api.py b/tests/ft/neuron/api.py index 7ec15ee4..a12f83ad 100644 --- a/tests/ft/neuron/api.py +++ b/tests/ft/neuron/api.py @@ -168,6 +168,7 @@ def read_tag(node, group, tag, sync=False): finally: return x[0]['value'] + def read_tag_error(node, group, tag, sync=False): response = read_tags(node, group, sync) assert 200 == response.status_code @@ -205,6 +206,7 @@ def write_tag(node, group, tag, value): def write_tags(node, group, tag_values): return requests.post(url=config.BASE_URL + "/api/v2/write/tags", headers={"Authorization": config.default_jwt}, json={"node": node, "group": group, "tags": tag_values}) + def write_gtags(json): return requests.post(url=config.BASE_URL + "/api/v2/write/gtags", headers={"Authorization": config.default_jwt}, json=json) @@ -243,45 +245,64 @@ def subscribe_group_update(app, driver, group, params={}): def subscribe_groups(app, groups): return requests.post(url=config.BASE_URL + "/api/v2/subscribes", headers={"Authorization": config.default_jwt}, json={"app": app, "groups": groups}) + @gen_check def unsubscribe_group(app, driver, group): return requests.delete(url=config.BASE_URL + "/api/v2/subscribe", headers={"Authorization": config.default_jwt}, json={"app": app, "driver": driver, "group": group}) + def get_metrics(category="global", node=""): return requests.get(url=config.BASE_URL + "/api/v2/metrics?category=" + category + "&node=" + node, headers={"Authorization": config.default_jwt}) + def get_global_config(): return requests.get(url=config.BASE_URL + "/api/v2/global/config", headers={"Authorization": config.default_jwt}) + def put_global_config(json): return requests.put(url=config.BASE_URL + "/api/v2/global/config", headers={"Authorization": config.default_jwt}, json=json) + @gen_check def put_driver(name, plugin, params, groups=[], jwt=config.default_jwt): return put_drivers([{"name": name, "plugin": plugin, "params": params, "groups": groups}]) + @gen_check def put_drivers(drivers, jwt=config.default_jwt): return requests.put(url=config.BASE_URL + '/api/v2/global/drivers', headers={"Authorization": jwt}, json={"nodes": drivers}) + def get_driver(name, jwt=config.default_jwt): return get_drivers(names=[name]) + def get_drivers(names=None, jwt=config.default_jwt): if names and not isinstance(names, str): names = ','.join(names) return requests.get(url=config.BASE_URL + '/api/v2/global/drivers', headers={"Authorization": jwt}, params={"name": names}) + def get_plugin_schema(plugin): return requests.get(url=config.BASE_URL + "/api/v2/schema?schema_name=" + plugin, headers={"Authorization": config.default_jwt}) + def get_plugin(): return requests.get(url=config.BASE_URL + "/api/v2/plugin", headers={"Authorization": config.default_jwt}) + def get_version(): return requests.get(url=config.BASE_URL + "/api/v2/version", headers={"Authorization": config.default_jwt}) +def prgfile_upload(driver, path, params): + return requests.post(url=config.BASE_URL + "/api/v2/prgfile", headers={"Authorization": config.default_jwt}, json={"driver": driver, "path": path, "parameters": params}) + + +def prgfile_process(driver): + return requests.get(url=config.BASE_URL + "/api/v2/prgfile?driver=" + driver, headers={"Authorization": config.default_jwt}) + + # plugin setting @@ -296,7 +317,8 @@ def modbus_rtu_node_setting(node, port, connection_mode=0, transport_mode=0, int "max_retries": max_retries, "link": link, "device": device, "stop": stop, "parity": parity, "baud": baud, "data": data}) + def mqtt_node_setting(node): - return node_setting(node, json={"client-id": "neuron_aBcDeF", "qos":0, "format": 0, + return node_setting(node, json={"client-id": "neuron_aBcDeF", "qos": 0, "format": 0, "write-req-topic": f"/neuron/{node}/write/req", "write-resp-topic": f"/neuron/{node}/write/resp", - "offline-cache": False, "cache-sync-interval": 100, "host": "broker.emqx.io", "port": 1883, "username": "", "password": "", "ssl": False}) \ No newline at end of file + "offline-cache": False, "cache-sync-interval": 100, "host": "broker.emqx.io", "port": 1883, "username": "", "password": "", "ssl": False}) diff --git a/tests/plugins/c1/c1_2.c b/tests/plugins/c1/c1_2.c index a349bcea..20b5c4fb 100644 --- a/tests/plugins/c1/c1_2.c +++ b/tests/plugins/c1/c1_2.c @@ -127,9 +127,12 @@ static int driver_config(neu_plugin_t *plugin, const char *config) static int driver_request(neu_plugin_t *plugin, neu_reqresp_head_t *head, void *data) { - (void) plugin; - (void) head; (void) data; + switch (head->type) { + default: + plog_warn(plugin, "unhandle msg type: %d", head->type); + break; + } return 0; }