mirror of
https://github.com/emqx/neuron.git
synced 2026-10-17 04:40:42 +08:00
feat: add scan tags reqest & response
This commit is contained in:
@@ -523,6 +523,11 @@ static int adapter_command(neu_adapter_t *adapter, neu_reqresp_head_t header,
|
||||
strcpy(pheader->receiver, header.sender);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_SCAN_TAGS: {
|
||||
neu_req_scan_tags_t *cmd = (neu_req_scan_tags_t *) data;
|
||||
strcpy(pheader->receiver, cmd->driver);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1181,6 +1186,16 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
adapter->plugin, (neu_reqresp_head_t *) header, &header[1]);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_SCAN_TAGS: {
|
||||
neu_adapter_driver_scan_tags((neu_adapter_driver_t *) adapter, header);
|
||||
break;
|
||||
}
|
||||
case NEU_RESP_SCAN_TAGS: {
|
||||
adapter->module->intf_funs->request(
|
||||
adapter->plugin, (neu_reqresp_head_t *) header, &header[1]);
|
||||
neu_msg_free(msg);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
nlog_warn("adapter: %s recv msg type error, type: %s", adapter->name,
|
||||
neu_reqresp_type_string(header->type));
|
||||
|
||||
@@ -294,16 +294,33 @@ static void update(neu_adapter_t *adapter, const char *group, const char *tag,
|
||||
update_with_meta(adapter, group, tag, value, NULL, 0);
|
||||
}
|
||||
|
||||
static void scan_tags_response(neu_adapter_t *adapter, void *r, neu_error error,
|
||||
void *tags, neu_type_e type, bool is_array)
|
||||
{
|
||||
neu_reqresp_head_t * req = (neu_reqresp_head_t *) r;
|
||||
neu_resp_scan_tags_t value = {
|
||||
.scan_tags = tags,
|
||||
.error = error,
|
||||
.type = type,
|
||||
.is_array = is_array,
|
||||
};
|
||||
req->type = NEU_RESP_SCAN_TAGS;
|
||||
nlog_notice("scan tags response <%p>", req->ctx);
|
||||
|
||||
adapter->cb_funs.response(adapter, req, &value);
|
||||
}
|
||||
|
||||
neu_adapter_driver_t *neu_adapter_driver_create()
|
||||
{
|
||||
neu_adapter_driver_t *driver = calloc(1, sizeof(neu_adapter_driver_t));
|
||||
|
||||
driver->cache = neu_driver_cache_new();
|
||||
driver->driver_events = neu_event_new();
|
||||
driver->adapter.cb_funs.driver.update = update;
|
||||
driver->adapter.cb_funs.driver.write_response = write_response;
|
||||
driver->adapter.cb_funs.driver.update_im = update_im;
|
||||
driver->adapter.cb_funs.driver.update_with_meta = update_with_meta;
|
||||
driver->cache = neu_driver_cache_new();
|
||||
driver->driver_events = neu_event_new();
|
||||
driver->adapter.cb_funs.driver.update = update;
|
||||
driver->adapter.cb_funs.driver.write_response = write_response;
|
||||
driver->adapter.cb_funs.driver.update_im = update_im;
|
||||
driver->adapter.cb_funs.driver.update_with_meta = update_with_meta;
|
||||
driver->adapter.cb_funs.driver.scan_tags_response = scan_tags_response;
|
||||
|
||||
return driver;
|
||||
}
|
||||
@@ -2289,4 +2306,30 @@ void neu_adapter_driver_unsubscribe(neu_adapter_driver_t * driver,
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&find->apps_mtx);
|
||||
}
|
||||
}
|
||||
|
||||
void neu_adapter_driver_scan_tags(neu_adapter_driver_t *driver,
|
||||
neu_reqresp_head_t * req)
|
||||
{
|
||||
if (driver->adapter.state != NEU_NODE_RUNNING_STATE_RUNNING) {
|
||||
driver->adapter.cb_funs.driver.scan_tags_response(
|
||||
&driver->adapter, req, NEU_ERR_PLUGIN_NOT_RUNNING, NULL,
|
||||
NEU_TYPE_ERROR, false);
|
||||
|
||||
nlog_warn("%s not running", driver->adapter.name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (driver->adapter.module->intf_funs->driver.scan_tags == NULL) {
|
||||
driver->adapter.cb_funs.driver.scan_tags_response(
|
||||
&driver->adapter, req, NEU_ERR_PLUGIN_NOT_SUPPORT_SCAN_TAGS, NULL,
|
||||
NEU_TYPE_ERROR, false);
|
||||
|
||||
nlog_warn("%s not support scan tags", driver->adapter.name);
|
||||
return;
|
||||
}
|
||||
|
||||
neu_req_scan_tags_t *cmd = (neu_req_scan_tags_t *) &req[1];
|
||||
driver->adapter.module->intf_funs->driver.scan_tags(driver->adapter.plugin,
|
||||
req, cmd->id);
|
||||
}
|
||||
|
||||
@@ -87,4 +87,7 @@ void neu_adapter_driver_subscribe(neu_adapter_driver_t *driver,
|
||||
neu_req_subscribe_t * req);
|
||||
void neu_adapter_driver_unsubscribe(neu_adapter_driver_t * driver,
|
||||
neu_req_unsubscribe_t *req);
|
||||
|
||||
void neu_adapter_driver_scan_tags(neu_adapter_driver_t *driver,
|
||||
neu_reqresp_head_t * req);
|
||||
#endif
|
||||
|
||||
@@ -93,7 +93,9 @@ extern "C" {
|
||||
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)
|
||||
XX(NEU_RESP_PRGFILE_PROCESS, neu_resp_prgfile_process_t) \
|
||||
XX(NEU_REQ_SCAN_TAGS, neu_req_scan_tags_t) \
|
||||
XX(NEU_RESP_SCAN_TAGS, neu_resp_scan_tags_t)
|
||||
|
||||
static inline size_t neu_reqresp_size(neu_reqresp_type_e t)
|
||||
{
|
||||
|
||||
@@ -1036,6 +1036,7 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
}
|
||||
case NEU_REQ_PRGFILE_PROCESS:
|
||||
case NEU_REQ_PRGFILE_UPLOAD:
|
||||
case NEU_REQ_SCAN_TAGS:
|
||||
case NEU_REQ_GET_NODE_STATE: {
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
@@ -1245,6 +1246,7 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
case NEU_RESP_ERROR:
|
||||
case NEU_RESP_READ_GROUP:
|
||||
case NEU_RESP_PRGFILE_PROCESS:
|
||||
case NEU_RESP_SCAN_TAGS:
|
||||
forward_msg(manager, header, header->receiver);
|
||||
break;
|
||||
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
/**
|
||||
* NEURON IIoT System for Industry 4.0
|
||||
* Copyright (C) 2020-2022 EMQ Technologies Co., Ltd All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
|
||||
/*
|
||||
* DO NOT EDIT THIS FILE MANUALLY!
|
||||
* It was automatically generated by `json-autotype`.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <jansson.h>
|
||||
|
||||
#include "define.h"
|
||||
#include "msg.h"
|
||||
#include "json/json.h"
|
||||
|
||||
#include "json/neu_json_scan.h"
|
||||
|
||||
int neu_json_decode_scan_tags_req(char *buf, neu_json_scan_tags_req_t **result)
|
||||
{
|
||||
void *json_obj = neu_json_decode_new(buf);
|
||||
if (NULL == json_obj) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
neu_json_scan_tags_req_t *req = calloc(1, sizeof(neu_json_scan_tags_req_t));
|
||||
if (req == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
neu_json_elem_t req_node_elems[] = { {
|
||||
.name = "node",
|
||||
.t = NEU_JSON_STR,
|
||||
} };
|
||||
|
||||
neu_json_elem_t req_id_elems[] = {
|
||||
{
|
||||
.name = "id",
|
||||
.t = NEU_JSON_STR,
|
||||
},
|
||||
};
|
||||
|
||||
if (0 !=
|
||||
neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_node_elems),
|
||||
req_node_elems)) {
|
||||
neu_json_decode_free(json_obj);
|
||||
free(req);
|
||||
return -1;
|
||||
}
|
||||
|
||||
neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_id_elems),
|
||||
req_id_elems);
|
||||
req->node = req_node_elems[0].v.val_str;
|
||||
req->id = req_id_elems[0].v.val_str;
|
||||
*result = req;
|
||||
|
||||
neu_json_decode_free(json_obj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void neu_json_decode_scan_tags_req_free(neu_json_scan_tags_req_t *req)
|
||||
{
|
||||
free(req->node);
|
||||
free(req->id);
|
||||
free(req);
|
||||
}
|
||||
|
||||
int neu_json_encode_scan_tags_resp(void *json_object, void *param)
|
||||
{
|
||||
int ret = 0;
|
||||
neu_resp_scan_tags_t *resp = (neu_resp_scan_tags_t *) param;
|
||||
void * tag_array = neu_json_array();
|
||||
int len = 0;
|
||||
|
||||
if (NULL != resp->scan_tags) {
|
||||
len = utarray_len(resp->scan_tags);
|
||||
utarray_foreach(resp->scan_tags, neu_scan_tag_t *, p_tag)
|
||||
{
|
||||
if (NULL != p_tag) {
|
||||
neu_json_elem_t tag_elems[] = {
|
||||
{
|
||||
.name = "name",
|
||||
.t = NEU_JSON_STR,
|
||||
.v.val_str = p_tag->name,
|
||||
},
|
||||
{
|
||||
.name = "id",
|
||||
.t = NEU_JSON_STR,
|
||||
.v.val_str = p_tag->id,
|
||||
},
|
||||
{
|
||||
.name = "tag",
|
||||
.t = NEU_JSON_INT,
|
||||
.v.val_int = p_tag->type,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
neu_json_encode_array(tag_array, tag_elems,
|
||||
NEU_JSON_ELEM_SIZE(tag_elems));
|
||||
}
|
||||
}
|
||||
|
||||
utarray_free(resp->scan_tags);
|
||||
}
|
||||
|
||||
neu_json_elem_t resp_elems[] = { {
|
||||
.name = "error",
|
||||
.t = NEU_JSON_INT,
|
||||
.v.val_int = resp->error,
|
||||
},
|
||||
{
|
||||
.name = "total",
|
||||
.t = NEU_JSON_INT,
|
||||
.v.val_int = len,
|
||||
},
|
||||
{
|
||||
.name = "type",
|
||||
.t = NEU_JSON_INT,
|
||||
.v.val_int = resp->type,
|
||||
},
|
||||
{
|
||||
.name = "is_array",
|
||||
.t = NEU_JSON_BOOL,
|
||||
.v.val_bool = resp->is_array,
|
||||
},
|
||||
{
|
||||
.name = "tags",
|
||||
.t = NEU_JSON_OBJECT,
|
||||
.v.val_object = tag_array,
|
||||
} };
|
||||
|
||||
ret = neu_json_encode_field(json_object, resp_elems,
|
||||
NEU_JSON_ELEM_SIZE(resp_elems));
|
||||
|
||||
return ret;
|
||||
}
|
||||
Reference in New Issue
Block a user