Files
CCU621M/Third_party/sdkEng/dev_model/impl_gateway.c
T

2538 lines
90 KiB
C

/*
* Copyright (C) 2015-2018 Alibaba Group Holding Limited
*/
#include "iotx_dm_internal.h"
#if defined(DEPRECATED_LINKKIT) && defined(DEVICE_MODEL_GATEWAY)
#include "impl_gateway.h"
#ifdef INFRA_MEM_STATS
#include "infra_mem_stats.h"
#define IMPL_GATEWAY_MALLOC(size) LITE_malloc(size, MEM_MAGIC, "impl.gateway")
#define IMPL_GATEWAY_FREE(ptr) IMPL_GATEWAY_FREE(ptr)
#else
#define IMPL_GATEWAY_MALLOC(size) HAL_Malloc(size)
#define IMPL_GATEWAY_FREE(ptr) {HAL_Free((void *)ptr);ptr = NULL;}
#endif
#ifdef INFRA_LOG
#include "infra_log.h"
#define impl_gateway_err(...) log_err("impl.gateway", __VA_ARGS__)
#define impl_gateway_info(...) log_info("impl.gateway", __VA_ARGS__)
#define impl_gateway_debug(...) log_debug("impl.gateway", __VA_ARGS__)
#else
#define impl_gateway_err(...)
#define impl_gateway_info(...)
#define impl_gateway_debug(...)
#endif
static linkkit_gateway_legacy_ctx_t g_linkkit_gateway_legacy_ctx = {0};
static linkkit_gateway_legacy_ctx_t *_linkkit_gateway_legacy_get_ctx(void)
{
return &g_linkkit_gateway_legacy_ctx;
}
static void _linkkit_gateway_mutex_lock(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->mutex) {
HAL_MutexLock(linkkit_gateway_ctx->mutex);
}
}
static void _linkkit_gateway_mutex_unlock(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->mutex) {
HAL_MutexUnlock(linkkit_gateway_ctx->mutex);
}
}
static void _linkkit_gateway_upstream_mutex_lock(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->upstream_mutex) {
HAL_MutexLock(linkkit_gateway_ctx->upstream_mutex);
}
}
static void _linkkit_gateway_upstream_mutex_unlock(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->upstream_mutex) {
HAL_MutexUnlock(linkkit_gateway_ctx->upstream_mutex);
}
}
static int _linkkit_gateway_callback_list_insert(int devid, linkkit_cbs_t *callback, void *context)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_dev_callback_node_t *search_node = NULL, *node = NULL;
list_for_each_entry(search_node, &linkkit_gateway_ctx->dev_callback_list, linked_list,
linkkit_gateway_dev_callback_node_t) {
if (search_node->devid == devid) {
impl_gateway_info("Device Already Exist: %d", devid);
return SUCCESS_RETURN;
}
}
node = IMPL_GATEWAY_MALLOC(sizeof(linkkit_gateway_dev_callback_node_t));
if (node == NULL) {
return STATE_SYS_DEPEND_MALLOC;
}
memset(node, 0, sizeof(linkkit_gateway_dev_callback_node_t));
node->devid = devid;
node->callback = callback;
node->callback_ctx = context;
INIT_LIST_HEAD(&node->linked_list);
list_add(&node->linked_list, &linkkit_gateway_ctx->dev_callback_list);
return SUCCESS_RETURN;
}
static int _linkkit_gateway_callback_list_remove(int devid)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_dev_callback_node_t *search_node = NULL;
list_for_each_entry(search_node, &linkkit_gateway_ctx->dev_callback_list, linked_list,
linkkit_gateway_dev_callback_node_t) {
if (search_node->devid == devid) {
impl_gateway_info("Device Found: %d, Delete It", devid);
list_del(&search_node->linked_list);
IMPL_GATEWAY_FREE(search_node);
return SUCCESS_RETURN;
}
}
return FAIL_RETURN;
}
static int _linkkit_gateway_callback_list_search(int devid, linkkit_gateway_dev_callback_node_t **node)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_dev_callback_node_t *search_node = NULL;
if (devid < 0 || node == NULL || *node != NULL) {
return FAIL_RETURN;
}
list_for_each_entry(search_node, &linkkit_gateway_ctx->dev_callback_list, linked_list,
linkkit_gateway_dev_callback_node_t) {
if (search_node->devid == devid) {
impl_gateway_info("Device Found: %d", devid);
*node = search_node;
return SUCCESS_RETURN;
}
}
return FAIL_RETURN;
}
static void _linkkit_gateway_callback_list_destroy(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_dev_callback_node_t *search_node = NULL;
linkkit_gateway_dev_callback_node_t *next_node = NULL;
list_for_each_entry_safe(search_node, next_node, &linkkit_gateway_ctx->dev_callback_list, linked_list,
linkkit_gateway_dev_callback_node_t) {
list_del(&search_node->linked_list);
IMPL_GATEWAY_FREE(search_node);
}
}
static int _linkkit_gateway_upstream_sync_callback_list_insert(int msgid, void *semaphore,
linkkit_gateway_upstream_sync_callback_node_t **node)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL;
list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list,
linkkit_gateway_upstream_sync_callback_node_t) {
if (search_node->msgid == msgid) {
impl_gateway_info("Message Already Exist: %d", msgid);
return FAIL_RETURN;
}
}
search_node = IMPL_GATEWAY_MALLOC(sizeof(linkkit_gateway_upstream_sync_callback_node_t));
if (search_node == NULL) {
return STATE_SYS_DEPEND_MALLOC;
}
memset(search_node, 0, sizeof(linkkit_gateway_upstream_sync_callback_node_t));
search_node->msgid = msgid;
search_node->semaphore = semaphore;
INIT_LIST_HEAD(&search_node->linked_list);
list_add(&search_node->linked_list, &linkkit_gateway_ctx->upstream_sync_callback_list);
impl_gateway_info("New Message, msgid: %d", msgid);
*node = search_node;
return SUCCESS_RETURN;
}
static int _linkkit_gateway_upstream_sync_callback_list_remove(int msgid)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL;
list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list,
linkkit_gateway_upstream_sync_callback_node_t) {
if (search_node->msgid == msgid) {
impl_gateway_info("Message Found: %d, Delete It", msgid);
HAL_SemaphoreDestroy(search_node->semaphore);
list_del(&search_node->linked_list);
IMPL_GATEWAY_FREE(search_node);
return SUCCESS_RETURN;
}
}
return FAIL_RETURN;
}
static int _linkkit_gateway_upstream_sync_callback_list_search(int msgid,
linkkit_gateway_upstream_sync_callback_node_t **node)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL;
if (node == NULL || *node != NULL) {
return FAIL_RETURN;
}
list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list,
linkkit_gateway_upstream_sync_callback_node_t) {
if (search_node->msgid == msgid) {
impl_gateway_info("Sync Message Found: %d", msgid);
*node = search_node;
return SUCCESS_RETURN;
}
}
return FAIL_RETURN;
}
static void _linkkit_gateway_upstream_sync_callback_list_destroy(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL, *next_node = NULL;
list_for_each_entry_safe(search_node, next_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list,
linkkit_gateway_upstream_sync_callback_node_t) {
list_del(&search_node->linked_list);
HAL_SemaphoreDestroy(search_node->semaphore);
IMPL_GATEWAY_FREE(search_node);
}
}
static int _linkkit_gateway_upstream_async_callback_list_insert(int msgid, int timeout_ms,
linkkit_gateway_upstream_async_callback callback, void *context)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_async_callback_node_t *search_node = NULL, *node = NULL;
list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list,
linkkit_gateway_upstream_async_callback_node_t) {
if (search_node->msgid == msgid) {
impl_gateway_info("Async Message Already Exist: %d", msgid);
return FAIL_RETURN;
}
}
node = IMPL_GATEWAY_MALLOC(sizeof(linkkit_gateway_upstream_async_callback_node_t));
if (node == NULL) {
return STATE_SYS_DEPEND_MALLOC;
}
memset(node, 0, sizeof(linkkit_gateway_upstream_async_callback_node_t));
node->msgid = msgid;
node->timeout_ms = timeout_ms;
node->timestamp_ms = HAL_UptimeMs();
node->callback = callback;
node->callback_ctx = context;
INIT_LIST_HEAD(&node->linked_list);
list_add(&node->linked_list, &linkkit_gateway_ctx->upstream_async_callback_list);
return SUCCESS_RETURN;
}
static int _linkkit_gateway_upstream_async_callback_list_remove(int msgid)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_async_callback_node_t *search_node = NULL;
list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list,
linkkit_gateway_upstream_async_callback_node_t) {
if (search_node->msgid == msgid) {
impl_gateway_info("Async Message Found: %d, Delete It", msgid);
list_del(&search_node->linked_list);
IMPL_GATEWAY_FREE(search_node);
return SUCCESS_RETURN;
}
}
return FAIL_RETURN;
}
static int _linkkit_gateway_upstream_async_callback_list_search(int msgid,
linkkit_gateway_upstream_async_callback_node_t **node)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_async_callback_node_t *search_node = NULL;
if (node == NULL || *node != NULL) {
return FAIL_RETURN;
}
list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list,
linkkit_gateway_upstream_async_callback_node_t) {
if (search_node->msgid == msgid) {
impl_gateway_info("Async Message Found: %d", msgid);
*node = search_node;
return SUCCESS_RETURN;
}
}
return FAIL_RETURN;
}
static void _linkkit_gateway_upstream_async_callback_list_destroy(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_async_callback_node_t *search_node = NULL, *next_node = NULL;
list_for_each_entry_safe(search_node, next_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list,
linkkit_gateway_upstream_async_callback_node_t) {
list_del(&search_node->linked_list);
IMPL_GATEWAY_FREE(search_node);
}
}
static void _linkkit_gateway_upstream_callback_remove(int msgid, int code)
{
int res = 0;
linkkit_gateway_upstream_sync_callback_node_t *sync_node = NULL;
res = _linkkit_gateway_upstream_sync_callback_list_search(msgid, &sync_node);
if (res != SUCCESS_RETURN) {
linkkit_gateway_upstream_async_callback_node_t *node = NULL;
res = _linkkit_gateway_upstream_async_callback_list_search(msgid, &node);
if (res == SUCCESS_RETURN) {
uint64_t current_time = HAL_UptimeMs();
if (current_time - node->timestamp_ms > node->timeout_ms) {
if (node->callback) {
node->callback(FAIL_RETURN, node->callback_ctx);
}
} else {
if (node->callback) {
int return_value = (code == IOTX_DM_ERR_CODE_SUCCESS) ? (SUCCESS_RETURN) : (FAIL_RETURN);
impl_gateway_info("Async Message %d Result: %d", msgid, return_value);
node->callback(return_value, node->callback_ctx);
}
}
_linkkit_gateway_upstream_async_callback_list_remove(msgid);
}
} else {
sync_node->code = (code == IOTX_DM_ERR_CODE_SUCCESS) ? (SUCCESS_RETURN) : (FAIL_RETURN);
impl_gateway_info("Sync Message %d Result: %d", msgid, sync_node->code);
HAL_SemaphorePost(sync_node->semaphore);
}
}
linkkit_params_t *linkkit_gateway_get_default_params(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
/* Legacy Parameter */
linkkit_gateway_ctx->init_params.maxMsgSize = 20 * 1024;
linkkit_gateway_ctx->init_params.maxMsgQueueSize = 16;
linkkit_gateway_ctx->init_params.threadPoolSize = 4;
linkkit_gateway_ctx->init_params.threadStackSize = 8 * 1024;
return &linkkit_gateway_ctx->init_params;
}
int linkkit_gateway_setopt(linkkit_params_t *params, int option, void *value, int value_len)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (params == NULL || value == NULL) {
return FAIL_RETURN;
}
switch (option) {
case LINKKIT_OPT_MAX_MSG_SIZE: {
if (value_len != sizeof(int)) {
return FAIL_RETURN;
}
if (*((int *)value) < 256) {
impl_gateway_err("maxMsgSize should not less than 256 bytes\n");
return FAIL_RETURN;
}
linkkit_gateway_ctx->init_params.maxMsgSize = *((int *)value);
}
break;
case LINKKIT_OPT_MAX_MSG_QUEUE_SIZE: {
if (value_len != sizeof(int)) {
return FAIL_RETURN;
}
if (*((int *)value) < 1) {
impl_gateway_err("maxMsgQueueSize should not less than 1\n");
return FAIL_RETURN;
}
linkkit_gateway_ctx->init_params.maxMsgQueueSize = *((int *)value);
}
break;
case LINKKIT_OPT_THREAD_POOL_SIZE: {
if (value_len != sizeof(int)) {
return FAIL_RETURN;
}
if (*((int *)value) < 1) {
impl_gateway_err("threadPoolSize should not less than 1\n");
return FAIL_RETURN;
}
linkkit_gateway_ctx->init_params.threadPoolSize = *((int *)value);
}
break;
case LINKKIT_OPT_THREAD_STACK_SIZE: {
if (value_len != sizeof(int)) {
return FAIL_RETURN;
}
if (*((int *)value) < 1024) {
impl_gateway_err("threadStackSize should not less than 1024\n");
return FAIL_RETURN;
}
linkkit_gateway_ctx->init_params.threadStackSize = *((int *)value);
}
break;
case LINKKIT_OPT_PROPERTY_POST_REPLY:
iotx_dm_set_opt(0, value);
break;
case LINKKIT_OPT_EVENT_POST_REPLY:
iotx_dm_set_opt(1, value);
break;
case LINKKIT_OPT_PROPERTY_SET_REPLY:
iotx_dm_set_opt(2, value);
break;
default:
impl_gateway_err("unknow option: %d\n", option);
return FAIL_RETURN;
}
return SUCCESS_RETURN;
}
int linkkit_gateway_set_event_callback(linkkit_params_t *params, int (*event_cb)(linkkit_event_t *ev, void *ctx),
void *ctx)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (params == NULL || event_cb == NULL) {
return FAIL_RETURN;
}
linkkit_gateway_ctx->init_params.event_cb = event_cb;
linkkit_gateway_ctx->init_params.ctx = ctx;
return SUCCESS_RETURN;
}
int linkkit_gateway_init(linkkit_params_t *initParams)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (initParams == NULL) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_inited == 1) {
return FAIL_RETURN;
}
if (initParams->maxMsgSize < 256 ||
initParams->maxMsgQueueSize < 1 ||
initParams->threadPoolSize < 1 ||
initParams->threadStackSize < 1024) {
return FAIL_RETURN;
}
linkkit_gateway_ctx->is_inited = 1;
return SUCCESS_RETURN;
}
int linkkit_gateway_exit(void)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->is_inited == 0) {
return FAIL_RETURN;
}
linkkit_gateway_ctx->is_inited = 0;
return SUCCESS_RETURN;
}
static void _linkkit_gateway_event_callback(iotx_dm_event_types_t type, char *payload)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
impl_gateway_info("Receive Message Type: %d", type);
if (payload) {
impl_gateway_info("Receive Message: %s", payload);
}
switch (type) {
case IOTX_DM_EVENT_CLOUD_CONNECTED: {
if (linkkit_gateway_ctx->init_params.event_cb) {
linkkit_event_t event;
memset(&event, 0, sizeof(linkkit_event_t));
event.event_type = LINKKIT_EVENT_CLOUD_CONNECTED;
linkkit_gateway_ctx->init_params.event_cb(&event, linkkit_gateway_ctx->init_params.ctx);
}
}
break;
case IOTX_DM_EVENT_CLOUD_DISCONNECT: {
if (linkkit_gateway_ctx->init_params.event_cb) {
linkkit_event_t event;
memset(&event, 0, sizeof(linkkit_event_t));
event.event_type = LINKKIT_EVENT_CLOUD_DISCONNECTED;
linkkit_gateway_ctx->init_params.event_cb(&event, linkkit_gateway_ctx->init_params.ctx);
}
}
break;
case IOTX_DM_EVENT_SUBDEV_REGISTER_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse JSON */
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN || !lite_cjson_is_object(&lite)) {
return;
}
/* Parse Message ID */
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_id)) {
return;
}
impl_gateway_info("Current Msg ID: %d", lite_item_id.value_int);
/* Parse Message Code */
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_code)) {
return;
}
impl_gateway_info("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_devid)) {
return;
}
impl_gateway_info("Current devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
case IOTX_DM_EVENT_SUBDEV_UNREGISTER_REPLY: {
}
break;
case IOTX_DM_EVENT_TOPO_ADD_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse JSON */
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN || !lite_cjson_is_object(&lite)) {
return;
}
/* Parse Message ID */
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_id)) {
return;
}
impl_gateway_info("Current Msg ID: %d", lite_item_id.value_int);
/* Parse Message Code */
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_code)) {
return;
}
impl_gateway_info("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_devid)) {
return;
}
impl_gateway_info("Current devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
case IOTX_DM_EVENT_TOPO_DELETE_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Code */
memset(&lite_item_code, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
case IOTX_DM_EVENT_COMBINE_LOGIN_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Code */
memset(&lite_item_code, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
case IOTX_DM_EVENT_COMBINE_LOGOUT_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Code */
memset(&lite_item_code, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
case IOTX_DM_EVENT_PROPERTY_SET: {
int res = 0;
linkkit_gateway_dev_callback_node_t *node = NULL;
lite_cjson_t lite, lite_item_devid, lite_item_payload;
char *params = NULL;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
/* Parse Payload */
memset(&lite_item_payload, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD),
&lite_item_payload);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Payload: %.*", lite_item_payload.value_length, lite_item_payload.value);
params = IMPL_GATEWAY_MALLOC(lite_item_payload.value_length + 1);
if (params == NULL) {
return;
}
memset(params, 0, lite_item_payload.value_length + 1);
memcpy(params, lite_item_payload.value, lite_item_payload.value_length);
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node);
_linkkit_gateway_upstream_mutex_unlock();
if (res == SUCCESS_RETURN) {
if (node->callback->set_property) {
node->callback->set_property(params, node->callback_ctx);
}
}
IMPL_GATEWAY_FREE(params);
}
break;
case IOTX_DM_EVENT_GATEWAY_PERMIT: {
int res = 0;
char product_key[IOTX_PRODUCT_KEY_LEN + 1] = {0};
lite_cjson_t lite, lite_item_pk, lite_item_timeout;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Product Key */
memset(&lite_item_pk, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PRODUCT_KEY,
strlen(LINKKIT_GATEWAY_LEGACY_KEY_PRODUCT_KEY), &lite_item_pk);
if (res != SUCCESS_RETURN || lite_item_pk.value_length >= IOTX_PRODUCT_KEY_LEN + 1) {
return;
}
impl_gateway_debug("Current Product Key: %.*s", lite_item_pk.value_length, lite_item_pk.value);
/* Parse Timeout */
memset(&lite_item_timeout, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_TIME, strlen(LINKKIT_GATEWAY_LEGACY_KEY_TIME),
&lite_item_timeout);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Timeout: %d", lite_item_timeout.value_int);
memcpy(product_key, lite_item_pk.value, lite_item_pk.value_length);
if (linkkit_gateway_ctx->init_params.event_cb) {
linkkit_event_t event;
memset(&event, 0, sizeof(linkkit_event_t));
event.event_type = LINKKIT_EVENT_SUBDEV_PERMITED;
event.event_data.subdev_permited.productKey = product_key;
event.event_data.subdev_permited.timeoutSec = lite_item_timeout.value_int;
linkkit_gateway_ctx->init_params.event_cb(&event, linkkit_gateway_ctx->init_params.ctx);
}
}
break;
case IOTX_DM_EVENT_THING_SERVICE_REQUEST: {
int res = 0;
linkkit_gateway_dev_callback_node_t *node = NULL;
lite_cjson_t lite, lite_item_id, lite_item_devid, lite_item_serviceid, lite_item_paylaod;
char *identifier = NULL, *input = NULL, *output = NULL;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
/* Parse Serviceid */
memset(&lite_item_serviceid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_SERVICEID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_SERVICEID),
&lite_item_serviceid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current ServiceID: %.*s", lite_item_serviceid.value_length, lite_item_serviceid.value);
/* Parse Payload */
memset(&lite_item_paylaod, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD),
&lite_item_paylaod);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Payload: %.*s", lite_item_paylaod.value_length, lite_item_paylaod.value);
identifier = IMPL_GATEWAY_MALLOC(lite_item_serviceid.value_length + 1);
if (identifier == NULL) {
return;
}
memset(identifier, 0, lite_item_serviceid.value_length + 1);
memcpy(identifier, lite_item_serviceid.value, lite_item_serviceid.value_length);
input = IMPL_GATEWAY_MALLOC(lite_item_paylaod.value_length + 1);
if (input == NULL) {
IMPL_GATEWAY_FREE(identifier);
return;
}
memset(input, 0, lite_item_paylaod.value_length + 1);
memcpy(input, lite_item_paylaod.value, lite_item_paylaod.value_length);
output = IMPL_GATEWAY_MALLOC(linkkit_gateway_ctx->init_params.maxMsgSize + 1);
if (output == NULL) {
IMPL_GATEWAY_FREE(identifier);
IMPL_GATEWAY_FREE(input);
return;
}
memset(output, 0, linkkit_gateway_ctx->init_params.maxMsgSize + 1);
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node);
_linkkit_gateway_upstream_mutex_unlock();
if (res == SUCCESS_RETURN) {
if (node->callback->call_service) {
res = node->callback->call_service(identifier, input, output, linkkit_gateway_ctx->init_params.maxMsgSize,
node->callback_ctx);
if (res == SUCCESS_RETURN) {
iotx_dm_deprecated_legacy_send_service_response(lite_item_devid.value_int, lite_item_id.value_int, 200,
lite_item_serviceid.value,
lite_item_serviceid.value_length, output, strlen(output));
} else {
iotx_dm_deprecated_legacy_send_service_response(lite_item_devid.value_int, lite_item_id.value_int, 202,
lite_item_serviceid.value,
lite_item_serviceid.value_length, "{}", strlen("{}"));
}
}
}
IMPL_GATEWAY_FREE(identifier);
IMPL_GATEWAY_FREE(input);
IMPL_GATEWAY_FREE(output);
}
break;
case IOTX_DM_EVENT_MODEL_DOWN_RAW: {
int res = 0;
linkkit_gateway_dev_callback_node_t *node = NULL;
lite_cjson_t lite, lite_item_devid, lite_item_rawdata;
char *output = NULL;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
/* Parse Raw Data */
memset(&lite_item_rawdata, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD),
&lite_item_rawdata);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Raw Data: %.*s", lite_item_rawdata.value_length, lite_item_rawdata.value);
output = IMPL_GATEWAY_MALLOC(linkkit_gateway_ctx->init_params.maxMsgSize + 1);
if (output == NULL) {
return;
}
memset(output, 0, linkkit_gateway_ctx->init_params.maxMsgSize + 1);
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node);
_linkkit_gateway_upstream_mutex_unlock();
if (res == SUCCESS_RETURN) {
if (node->callback->down_rawdata) {
res = node->callback->down_rawdata(lite_item_rawdata.value, lite_item_rawdata.value_length, output,
linkkit_gateway_ctx->init_params.maxMsgSize, node->callback_ctx);
if (res > 0) {
iotx_dm_post_rawdata(lite_item_devid.value_int, output, res);
}
}
}
IMPL_GATEWAY_FREE(output);
}
break;
case IOTX_DM_EVENT_MODEL_UP_RAW_REPLY: {
int res = 0;
linkkit_gateway_dev_callback_node_t *node = NULL;
lite_cjson_t lite, lite_item_devid, lite_item_rawdata;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
/* Parse Raw Data */
memset(&lite_item_rawdata, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD),
&lite_item_rawdata);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Raw Data: %.*s", lite_item_rawdata.value_length, lite_item_rawdata.value);
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node);
_linkkit_gateway_upstream_mutex_unlock();
if (res == SUCCESS_RETURN) {
if (node->callback->post_rawdata_reply) {
node->callback->post_rawdata_reply(lite_item_rawdata.value, lite_item_rawdata.value_length, node->callback_ctx);
}
}
}
break;
case IOTX_DM_EVENT_INITIALIZED: {
int res = 0;
linkkit_gateway_dev_callback_node_t *node = NULL;
lite_cjson_t lite, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node);
_linkkit_gateway_upstream_mutex_unlock();
if (res == SUCCESS_RETURN) {
if (node->callback->register_complete) {
node->callback->register_complete(node->callback_ctx);
}
}
}
break;
case IOTX_DM_EVENT_EVENT_PROPERTY_POST_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Code */
memset(&lite_item_code, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
case IOTX_DM_EVENT_EVENT_SPECIFIC_POST_REPLY: {
int res = 0;
char *eventid = NULL;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid, lite_item_eventid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Code */
memset(&lite_item_code, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
/* Parse Property ID */
memset(&lite_item_eventid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_EVENTID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_EVENTID),
&lite_item_eventid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current EventID: %.*s", lite_item_eventid.value_length, lite_item_eventid.value);
eventid = IMPL_GATEWAY_MALLOC(lite_item_eventid.value_length + 1);
if (eventid == NULL) {
return;
}
memset(eventid, 0, lite_item_eventid.value_length + 1);
memcpy(eventid, lite_item_eventid.value, lite_item_eventid.value_length);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
IMPL_GATEWAY_FREE(eventid);
}
break;
case IOTX_DM_EVENT_FOTA_NEW_FIRMWARE: {
int res = 0;
lite_cjson_t lite, lite_item_version;
char *version = NULL;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN || !lite_cjson_is_object(&lite)) {
return;
}
/* Parse Version */
memset(&lite_item_version, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_VERSION, strlen(LINKKIT_GATEWAY_LEGACY_KEY_VERSION),
&lite_item_version);
if (res != SUCCESS_RETURN || !lite_cjson_is_string(&lite_item_version)) {
return;
}
impl_gateway_debug("Current Firmware Version: %.*s", lite_item_version.value_length, lite_item_version.value);
version = IMPL_GATEWAY_MALLOC(lite_item_version.value_length + 1);
if (version == NULL) {
return;
}
memset(version, 0, lite_item_version.value_length + 1);
memcpy(version, lite_item_version.value, lite_item_version.value_length);
if (linkkit_gateway_ctx->fota_callback) {
linkkit_gateway_ctx->fota_callback(service_fota_callback_type_new_version_detected, version);
}
if (version) {
IMPL_GATEWAY_FREE(version);
}
}
break;
case IOTX_DM_EVENT_DEVICEINFO_UPDATE_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Code */
memset(&lite_item_code, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
case IOTX_DM_EVENT_DEVICEINFO_DELETE_REPLY: {
int res = 0;
lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid;
if (payload == NULL) {
return;
}
/* Parse Payload */
memset(&lite, 0, sizeof(lite_cjson_t));
res = lite_cjson_parse(payload, strlen(payload), &lite);
if (res != SUCCESS_RETURN) {
return;
}
/* Parse Id */
memset(&lite_item_id, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID),
&lite_item_id);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Id: %d", lite_item_id.value_int);
/* Parse Code */
memset(&lite_item_code, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE),
&lite_item_code);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Code: %d", lite_item_code.value_int);
/* Parse Devid */
memset(&lite_item_devid, 0, sizeof(lite_cjson_t));
res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID),
&lite_item_devid);
if (res != SUCCESS_RETURN) {
return;
}
impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int);
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int);
_linkkit_gateway_upstream_mutex_unlock();
}
break;
default: {
impl_gateway_info("Not Found Type For Now, Smile");
}
break;
}
}
static void *_linkkit_gateway_dispatch(void *params)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = (linkkit_gateway_legacy_ctx_t *)params;
if (params == NULL) {
return NULL;
}
while (linkkit_gateway_ctx->is_started) {
iotx_dm_dispatch();
HAL_SleepMs(20);
}
return NULL;
}
int linkkit_gateway_start(linkkit_cbs_t *cbs, void *ctx)
{
int res = 0, stack_used = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
iotx_dm_init_params_t dm_init_params;
linkkit_gateway_dev_callback_node_t *node = NULL;
if (cbs == NULL) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_inited == 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started) {
impl_gateway_info("Linkkit Gateway Already Started");
return SUCCESS_RETURN;
}
linkkit_gateway_ctx->is_inited = 1;
linkkit_gateway_ctx->is_started = 1;
/* Create Mutex */
linkkit_gateway_ctx->mutex = HAL_MutexCreate();
if (linkkit_gateway_ctx->mutex == NULL) {
linkkit_gateway_ctx->is_started = 0;
return FAIL_RETURN;
}
linkkit_gateway_ctx->upstream_mutex = HAL_MutexCreate();
if (linkkit_gateway_ctx->upstream_mutex == NULL) {
HAL_MutexDestroy(linkkit_gateway_ctx->mutex);
linkkit_gateway_ctx->is_started = 0;
return FAIL_RETURN;
}
/* Initialize Device Manager */
memset(&dm_init_params, 0, sizeof(iotx_dm_init_params_t));
dm_init_params.secret_type = IOTX_DM_DEVICE_SECRET_DEVICE;
dm_init_params.domain_type = IOTX_DM_CLOUD_DOMAIN_SHANGHAI;
dm_init_params.event_callback = _linkkit_gateway_event_callback;
res = iotx_dm_open();
if (res != SUCCESS_RETURN) {
HAL_MutexDestroy(linkkit_gateway_ctx->mutex);
HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex);
linkkit_gateway_ctx->is_started = 0;
return FAIL_RETURN;
}
res = iotx_dm_connect(&dm_init_params);
if (res != SUCCESS_RETURN) {
HAL_MutexDestroy(linkkit_gateway_ctx->mutex);
HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex);
iotx_dm_close();
linkkit_gateway_ctx->is_started = 0;
return FAIL_RETURN;
}
res = iotx_dm_subscribe(IOTX_DM_LOCAL_NODE_DEVID);
if (res != SUCCESS_RETURN) {
HAL_MutexDestroy(linkkit_gateway_ctx->mutex);
HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex);
iotx_dm_close();
linkkit_gateway_ctx->is_started = 0;
return FAIL_RETURN;
}
res = HAL_ThreadCreate(&linkkit_gateway_ctx->dispatch_thread, _linkkit_gateway_dispatch, linkkit_gateway_ctx, NULL,
&stack_used);
if (res != SUCCESS_RETURN) {
HAL_MutexDestroy(linkkit_gateway_ctx->mutex);
HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex);
iotx_dm_close();
linkkit_gateway_ctx->is_started = 0;
return FAIL_RETURN;
}
/* Insert Gateway Callback And Callback Context Into Device Callback Linkked List */
INIT_LIST_HEAD(&linkkit_gateway_ctx->dev_callback_list);
res = _linkkit_gateway_callback_list_insert(IOTX_DM_LOCAL_NODE_DEVID, cbs, ctx);
if (res != SUCCESS_RETURN) {
HAL_MutexDestroy(linkkit_gateway_ctx->mutex);
HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex);
iotx_dm_close();
linkkit_gateway_ctx->is_started = 0;
return FAIL_RETURN;
}
/* Init Upstream Callback List */
INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_sync_callback_list);
INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_async_callback_list);
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_search(IOTX_DM_LOCAL_NODE_DEVID, &node);
_linkkit_gateway_upstream_mutex_unlock();
if (res == SUCCESS_RETURN) {
if (node->callback->register_complete) {
node->callback->register_complete(node->callback_ctx);
}
}
return SUCCESS_RETURN;
}
int linkkit_gateway_stop(int devid)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
if (devid != IOTX_DM_LOCAL_NODE_DEVID) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
_linkkit_gateway_upstream_mutex_lock();
linkkit_gateway_ctx->is_started = 0;
iotx_dm_close();
HAL_SleepMs(200);
_linkkit_gateway_callback_list_destroy();
_linkkit_gateway_upstream_sync_callback_list_destroy();
_linkkit_gateway_upstream_async_callback_list_destroy();
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex);
HAL_MutexDestroy(linkkit_gateway_ctx->mutex);
linkkit_gateway_ctx->mutex = NULL;
linkkit_gateway_ctx->upstream_mutex = NULL;
memset(&linkkit_gateway_ctx->init_params, 0, sizeof(linkkit_params_t));
linkkit_gateway_ctx->dispatch_thread = NULL;
linkkit_gateway_ctx->fota_callback = NULL;
INIT_LIST_HEAD(&linkkit_gateway_ctx->dev_callback_list);
INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_sync_callback_list);
INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_async_callback_list);
return SUCCESS_RETURN;
}
int linkkit_gateway_subdev_register(char *productKey, char *deviceName, char *deviceSecret)
{
int res = 0, msgid = 0, code = 0, devid = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
void *semaphore = NULL;
linkkit_gateway_dev_callback_node_t *dev_callback_node = NULL;
if (productKey == NULL || strlen(productKey) >= IOTX_PRODUCT_KEY_LEN + 1 ||
deviceName == NULL || strlen(deviceName) >= IOTX_DEVICE_NAME_LEN + 1) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_deprecated_legacy_get_devid_by_pkdn(productKey, deviceName, &devid);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
/* Subdev Delete Topo */
res = iotx_dm_subdev_topo_del(devid);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
/* Subdev Register */
res = iotx_dm_deprecated_subdev_register(devid, deviceSecret);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
if (res > SUCCESS_RETURN) {
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
}
/* Subdev Add Topo */
res = iotx_dm_subdev_topo_add(devid);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_search(devid, &dev_callback_node);
_linkkit_gateway_upstream_mutex_unlock();
if (res == SUCCESS_RETURN) {
if (dev_callback_node->callback->register_complete) {
dev_callback_node->callback->register_complete(dev_callback_node->callback_ctx);
}
}
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_subdev_unregister(char *productKey, char *deviceName)
{
int res = 0, msgid = 0, code = 0, devid = 0;
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
void *semaphore = NULL;
if (productKey == NULL || strlen(productKey) >= IOTX_PRODUCT_KEY_LEN + 1 ||
deviceName == NULL || strlen(deviceName) >= IOTX_DEVICE_NAME_LEN + 1) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_deprecated_legacy_get_devid_by_pkdn(productKey, deviceName, &devid);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
/* Subdev Delete Topo */
res = iotx_dm_subdev_topo_del(devid);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_subdev_create(char *productKey, char *deviceName, linkkit_cbs_t *cbs, void *ctx)
{
int res = 0, devid = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (productKey == NULL || strlen(productKey) >= IOTX_PRODUCT_KEY_LEN + 1 ||
deviceName == NULL || strlen(deviceName) >= IOTX_DEVICE_NAME_LEN + 1 || cbs == NULL) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_subdev_create(productKey, "", deviceName, NULL, &devid);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_insert(devid, cbs, ctx);
if (res != SUCCESS_RETURN) {
iotx_dm_subdev_destroy(devid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return devid;
}
int linkkit_gateway_subdev_destroy(int devid)
{
int res = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (devid <= 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_callback_list_remove(devid);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = iotx_dm_subdev_destroy(devid);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_subdev_login(int devid)
{
int res = 0, msgid = 0, code = 0;
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
void *semaphore = NULL;
if (devid <= 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_subdev_login(devid);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = iotx_dm_subscribe(devid);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_subdev_logout(int devid)
{
int res = 0, msgid = 0, code = 0;
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
void *semaphore = NULL;
if (devid <= 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_subdev_logout(devid);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_get_devinfo(int devid, linkkit_devinfo_t *devinfo)
{
int res = 0, type = 0;
iotx_dm_dev_status_t status;
iotx_dm_dev_avail_t available;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (devid < 0 || devinfo == NULL) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
memset(devinfo, 0, sizeof(linkkit_devinfo_t));
res = iotx_dm_deprecated_legacy_get_pkdn_ptr_by_devid(devid, &(devinfo->productKey), &(devinfo->deviceName));
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_get_device_type(devid, &type);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
if (type == IOTX_DM_DEVICE_GATEWAY) {
devinfo->devtype = 0;
} else if (type == IOTX_DM_DEVICE_SUBDEV) {
devinfo->devtype = 1;
} else {
impl_gateway_info("wrong device type\n");
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_get_device_status(devid, &status);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
if (status >= IOTX_DM_DEV_STATUS_LOGINED) {
devinfo->login = 1;
}
if (status == IOTX_DM_DEV_STATUS_ONLINE) {
devinfo->online = 1;
}
res = iotx_dm_get_device_avail_status(devid, &available);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
devinfo->state = available;
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_trigger_event_json_sync(int devid, char *identifier, char *event, int timeout_ms)
{
int res = 0, msgid = 0, code = 0, event_reply_value = 0;
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
void *semaphore = NULL;
if (devid < 0 || identifier == NULL || event == NULL || timeout_ms < 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_get_opt(1, (void *)&event_reply_value);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
if (timeout_ms == 0 || event_reply_value == 0) {
res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
} else {
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
}
res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, timeout_ms);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_trigger_event_json(int devid, char *identifier, char *event, int timeout_ms,
void (*func)(int retval, void *ctx), void *ctx)
{
int res = 0, event_reply_value = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (devid < 0 || identifier == NULL || event == NULL || timeout_ms < 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_get_opt(1, (void *)&event_reply_value);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
impl_gateway_info("event_reply_value: %d", event_reply_value);
if (timeout_ms == 0 || event_reply_value == 0) {
res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
} else {
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
}
res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_async_callback_list_insert(res, timeout_ms, func, ctx);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_post_property_json_sync(int devid, char *property, int timeout_ms)
{
int res = 0, msgid = 0, code = 0, property_reply_value = 0;
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
void *semaphore = NULL;
if (devid < 0 || property == NULL || timeout_ms < 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_get_opt(0, (void *)&property_reply_value);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
if (timeout_ms == 0 || property_reply_value == 0) {
res = iotx_dm_post_property(devid, property, strlen(property));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
} else {
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
}
res = iotx_dm_post_property(devid, property, strlen(property));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, timeout_ms);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_post_property_json(int devid, char *property, int timeout_ms, void (*func)(int retval, void *ctx),
void *ctx)
{
int res = 0, property_reply_value = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (devid < 0 || property == NULL || timeout_ms < 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_get_opt(0, (void *)&property_reply_value);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
if (timeout_ms == 0 || property_reply_value == 0) {
res = iotx_dm_post_property(devid, property, strlen(property));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
} else {
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
}
res = iotx_dm_post_property(devid, property, strlen(property));
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_async_callback_list_insert(res, timeout_ms, func, ctx);
if (res != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_post_rawdata(int devid, void *data, int len)
{
int res = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (devid < 0 || data == NULL || len <= 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_post_rawdata(devid, data, len);
_linkkit_gateway_mutex_unlock();
return res;
}
int linkkit_gateway_fota_init(handle_service_fota_callback_fp_t callback_fp)
{
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
linkkit_gateway_ctx->fota_callback = callback_fp;
return SUCCESS_RETURN;
}
int linkkit_gateway_invoke_fota_service(void *data_buf, int data_buf_length)
{
int res = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
res = iotx_dm_fota_perform_sync(data_buf, data_buf_length);
_linkkit_gateway_mutex_unlock();
return res;
}
int linkkit_gateway_post_extinfos(int devid, linkkit_extinfo_t *extinfos, int nb_extinfos, int timeout_ms)
{
int res = 0, index = 0, msgid = 0, code = 0;
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
void *semaphore = NULL;
char *payload = NULL;
lite_cjson_item_t *lite_array = NULL, *lite_array_item = NULL;
if (devid < 0 || extinfos == NULL || nb_extinfos <= 0 || timeout_ms < 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
lite_array = lite_cjson_create_array();
if (lite_array == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
for (index = 0; index < nb_extinfos; index++) {
if (extinfos[index].attrKey == NULL || extinfos[index].attrValue == NULL) {
lite_cjson_delete(lite_array);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
lite_array_item = lite_cjson_create_object();
if (lite_array_item == NULL) {
lite_cjson_delete(lite_array);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
lite_cjson_add_string_to_object(lite_array_item, "attrKey", extinfos[index].attrKey);
lite_cjson_add_string_to_object(lite_array_item, "attrValue", extinfos[index].attrValue);
lite_cjson_add_item_to_array(lite_array, lite_array_item);
}
payload = lite_cjson_print_unformatted(lite_array);
if (payload == NULL) {
lite_cjson_delete(lite_array);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
lite_cjson_delete(lite_array);
if (timeout_ms == 0) {
res = iotx_dm_deviceinfo_update(devid, payload, strlen(payload));
IMPL_GATEWAY_FREE(payload);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
} else {
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
}
res = iotx_dm_deviceinfo_update(devid, payload, strlen(payload));
if (res < SUCCESS_RETURN) {
IMPL_GATEWAY_FREE(payload);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
IMPL_GATEWAY_FREE(payload);
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, timeout_ms);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_delete_extinfos(int devid, linkkit_extinfo_t *extinfos, int nb_extinfos, int timeout_ms)
{
int res = 0, index = 0, msgid = 0, code = 0;
linkkit_gateway_upstream_sync_callback_node_t *node = NULL;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
void *semaphore = NULL;
char *payload = NULL;
lite_cjson_item_t *lite_array = NULL, *lite_array_item = NULL;
if (devid < 0 || extinfos == NULL || nb_extinfos <= 0 || timeout_ms < 0) {
return FAIL_RETURN;
}
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
lite_array = lite_cjson_create_array();
if (lite_array == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
for (index = 0; index < nb_extinfos; index++) {
if (extinfos[index].attrKey == NULL || extinfos[index].attrValue == NULL) {
lite_cjson_delete(lite_array);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
lite_array_item = lite_cjson_create_object();
if (lite_array_item == NULL) {
lite_cjson_delete(lite_array);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
lite_cjson_add_string_to_object(lite_array_item, "attrKey", extinfos[index].attrKey);
lite_cjson_add_string_to_object(lite_array_item, "attrValue", extinfos[index].attrValue);
lite_cjson_add_item_to_array(lite_array, lite_array_item);
}
payload = lite_cjson_print_unformatted(lite_array);
if (payload == NULL) {
lite_cjson_delete(lite_array);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
lite_cjson_delete(lite_array);
if (timeout_ms == 0) {
res = iotx_dm_deviceinfo_delete(devid, payload, strlen(payload));
IMPL_GATEWAY_FREE(payload);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
} else {
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
}
res = iotx_dm_deviceinfo_delete(devid, payload, strlen(payload));
if (res < SUCCESS_RETURN) {
IMPL_GATEWAY_FREE(payload);
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
msgid = res;
IMPL_GATEWAY_FREE(payload);
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, timeout_ms);
if (res < SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_lock();
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_lock();
code = node->code;
_linkkit_gateway_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return FAIL_RETURN;
}
_linkkit_gateway_upstream_mutex_unlock();
_linkkit_gateway_mutex_unlock();
return SUCCESS_RETURN;
}
int linkkit_gateway_get_num_devices(void)
{
int dev_nums = 0;
linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx();
if (linkkit_gateway_ctx->is_started == 0) {
return FAIL_RETURN;
}
_linkkit_gateway_mutex_lock();
dev_nums = iotx_dm_subdev_number();
_linkkit_gateway_mutex_unlock();
return dev_nums;
}
#endif