/* * Copyright (C) 2015-2018 Alibaba Group Holding Limited */ #include "iotx_dm_internal.h" #ifdef DEPRECATED_LINKKIT #include "linkkit_export.h" #include "impl_solo.h" #ifdef INFRA_MEM_STATS #include "infra_mem_stats.h" #define IMPL_SOLO_MALLOC(size) LITE_malloc(size, MEM_MAGIC, "impl.solo") #define IMPL_SOLO_FREE(ptr) LITE_free(ptr) #else #define IMPL_SOLO_MALLOC(size) HAL_Malloc(size) #define IMPL_SOLO_FREE(ptr) {HAL_Free((void *)ptr);ptr = NULL;} #endif #ifdef INFRA_LOG #include "infra_log.h" #define impl_solo_err(...) log_err("impl.solo", __VA_ARGS__) #define impl_solo_info(...) log_info("impl.solo", __VA_ARGS__) #define impl_solo_debug(...) log_debug("impl.solo", __VA_ARGS__) #else #define impl_solo_err(...) #define impl_solo_info(...) #define impl_solo_debug(...) #endif linkkit_solo_legacy_ctx_t g_linkkit_solo_legacy_ctx = {0}; static being_deprecated linkkit_solo_legacy_ctx_t *_linkkit_solo_legacy_get_ctx(void) { return &g_linkkit_solo_legacy_ctx; } static void _linkkit_solo_mutex_lock(void) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (linkkit_solo_ctx->mutex) { HAL_MutexLock(linkkit_solo_ctx->mutex); } } static void _linkkit_solo_mutex_unlock(void) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (linkkit_solo_ctx->mutex) { HAL_MutexUnlock(linkkit_solo_ctx->mutex); } } static void _linkkit_solo_upstream_mutex_lock(void) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (linkkit_solo_ctx->upstream_mutex) { HAL_MutexLock(linkkit_solo_ctx->upstream_mutex); } } static void _linkkit_solo_upstream_mutex_unlock(void) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (linkkit_solo_ctx->upstream_mutex) { HAL_MutexUnlock(linkkit_solo_ctx->upstream_mutex); } } static int _impl_copy(_IN_ void *input, _IN_ int input_len, _OU_ void **output, _IN_ int output_len) { if (input == NULL || output == NULL || *output != NULL) { return STATE_USER_INPUT_INVALID; } *output = IMPL_SOLO_MALLOC(output_len); if (*output == NULL) { return STATE_SYS_DEPEND_MALLOC; } memset(*output, 0, output_len); memcpy(*output, input, input_len); return SUCCESS_RETURN; } static int _linkkit_solo_upstream_callback_list_insert(int msgid, handle_post_cb_fp_t callback) { int count = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); linkkit_solo_upstream_callback_node_t *search_node = NULL; list_for_each_entry(search_node, &linkkit_solo_ctx->callback_list, linked_list, linkkit_solo_upstream_callback_node_t) { count++; if (search_node->msgid == msgid) { impl_solo_info("Message ID Already Exist: %d", msgid); return FAIL_RETURN; } } impl_solo_info("linkkit_solo_upstream_callback_list node count: %d", count); search_node = IMPL_SOLO_MALLOC(sizeof(linkkit_solo_upstream_callback_node_t)); if (search_node == NULL) { return FAIL_RETURN; } memset(search_node, 0, sizeof(linkkit_solo_upstream_callback_node_t)); search_node->msgid = msgid; search_node->callback = callback; search_node->callback = callback; INIT_LIST_HEAD(&search_node->linked_list); list_add(&search_node->linked_list, &linkkit_solo_ctx->callback_list); return SUCCESS_RETURN; } static int _linkkit_solo_upstream_callback_list_remove(int msgid) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); linkkit_solo_upstream_callback_node_t *search_node = NULL; list_for_each_entry(search_node, &linkkit_solo_ctx->callback_list, linked_list, linkkit_solo_upstream_callback_node_t) { if (search_node->msgid == msgid) { list_del(&search_node->linked_list); IMPL_SOLO_FREE(search_node); return SUCCESS_RETURN; } } return FAIL_RETURN; } static int _linkkit_solo_upstream_callback_list_search(int msgid, linkkit_solo_upstream_callback_node_t **node) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); linkkit_solo_upstream_callback_node_t *search_node = NULL; list_for_each_entry(search_node, &linkkit_solo_ctx->callback_list, linked_list, linkkit_solo_upstream_callback_node_t) { if (search_node->msgid == msgid) { *node = search_node; return SUCCESS_RETURN; } } return FAIL_RETURN; } static int _linkkit_solo_upstream_callback_list_destroy(void) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); linkkit_solo_upstream_callback_node_t *search_node = NULL, *next_node = NULL; list_for_each_entry_safe(search_node, next_node, &linkkit_solo_ctx->callback_list, linked_list, linkkit_solo_upstream_callback_node_t) { list_del(&search_node->linked_list); IMPL_SOLO_FREE(search_node); } return FAIL_RETURN; } void *linkkit_dispatch(void) { iotx_dm_dispatch(); return NULL; } int being_deprecated linkkit_is_try_leave(void) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); return linkkit_solo_ctx->is_leaved; } int being_deprecated linkkit_set_opt(linkkit_opt_t opt, void *data) { int res = 0; if (data == NULL) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_set_opt(opt, data); _linkkit_solo_mutex_unlock(); return res; } static void _linkkit_solo_event_callback(iotx_dm_event_types_t type, char *payload) { int res = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid, lite_item_payload, lite_item_serviceid; lite_cjson_t lite_item_propertyid, lite_item_eventid, lite_item_configid, lite_item_configsize, lite_item_gettype; lite_cjson_t lite_item_sign, lite_item_signmethod, lite_item_url, lite_item_version; impl_solo_info("Receive Message Type: %d", type); if (payload) { impl_solo_info("Receive Message: %s", payload); res = dm_utils_json_parse(payload, strlen(payload), cJSON_Invalid, &lite); if (res != SUCCESS_RETURN) { return; } dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_ID, strlen(LINKKIT_SOLO_LEGACY_KEY_ID), cJSON_Invalid, &lite_item_id); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_CODE, strlen(LINKKIT_SOLO_LEGACY_KEY_CODE), cJSON_Invalid, &lite_item_code); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_DEVID, strlen(LINKKIT_SOLO_LEGACY_KEY_DEVID), cJSON_Invalid, &lite_item_devid); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_SOLO_LEGACY_KEY_PAYLOAD), cJSON_Invalid, &lite_item_payload); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_SERVICEID, strlen(LINKKIT_SOLO_LEGACY_KEY_SERVICEID), cJSON_Invalid, &lite_item_serviceid); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_PROPERTYID, strlen(LINKKIT_SOLO_LEGACY_KEY_PROPERTYID), cJSON_Invalid, &lite_item_propertyid); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_EVENTID, strlen(LINKKIT_SOLO_LEGACY_KEY_EVENTID), cJSON_Invalid, &lite_item_eventid); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_CONFIG_ID, strlen(LINKKIT_SOLO_LEGACY_KEY_CONFIG_ID), cJSON_Invalid, &lite_item_configid); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_CONFIG_SIZE, strlen(LINKKIT_SOLO_LEGACY_KEY_CONFIG_SIZE), cJSON_Invalid, &lite_item_configsize); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_GET_TYPE, strlen(LINKKIT_SOLO_LEGACY_KEY_GET_TYPE), cJSON_Invalid, &lite_item_gettype); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_SIGN, strlen(LINKKIT_SOLO_LEGACY_KEY_SIGN), cJSON_Invalid, &lite_item_sign); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_SIGN_METHOD, strlen(LINKKIT_SOLO_LEGACY_KEY_SIGN_METHOD), cJSON_Invalid, &lite_item_signmethod); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_URL, strlen(LINKKIT_SOLO_LEGACY_KEY_URL), cJSON_Invalid, &lite_item_url); dm_utils_json_object_item(&lite, LINKKIT_SOLO_LEGACY_KEY_VERSION, strlen(LINKKIT_SOLO_LEGACY_KEY_VERSION), cJSON_Invalid, &lite_item_version); } switch (type) { case IOTX_DM_EVENT_CLOUD_CONNECTED: { if (linkkit_solo_ctx->user_callback->on_connect) { linkkit_solo_ctx->user_callback->on_connect(linkkit_solo_ctx->user_context); } } break; case IOTX_DM_EVENT_CLOUD_DISCONNECT: { if (linkkit_solo_ctx->user_callback->on_disconnect) { linkkit_solo_ctx->user_callback->on_disconnect(linkkit_solo_ctx->user_context); } } break; case IOTX_DM_EVENT_MODEL_DOWN_RAW: { int res = 0, raw_data_len = 0; void *thing_id = NULL; unsigned char *raw_data = NULL; if (payload == NULL || lite_item_devid.type != cJSON_Number || lite_item_payload.type != cJSON_String) { return; } impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); impl_solo_debug("Current Raw Data: %.*s", lite_item_payload.value_length, lite_item_payload.value); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } res = dm_utils_str_to_hex(lite_item_payload.value, lite_item_payload.value_length, &raw_data, &raw_data_len); if (res != SUCCESS_RETURN) { return; } HEXDUMP_DEBUG(raw_data, raw_data_len); if (linkkit_solo_ctx->user_callback->raw_data_arrived) { linkkit_solo_ctx->user_callback->raw_data_arrived(thing_id, raw_data, raw_data_len, linkkit_solo_ctx->user_context); } IMPL_SOLO_FREE(raw_data); } break; case IOTX_DM_EVENT_THING_SERVICE_REQUEST: { int res = 0; void *thing_id = NULL; char *service = NULL; if (payload == NULL || lite_item_id.type != cJSON_Number || lite_item_devid.type != cJSON_Number || lite_item_serviceid.type != cJSON_String) { return; } impl_solo_debug("Current Id: %d", lite_item_id.value_int); impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); impl_solo_debug("Current ServiceID: %.*s", lite_item_serviceid.value_length, lite_item_serviceid.value); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } service = IMPL_SOLO_MALLOC(lite_item_serviceid.value_length + 1); if (service == NULL) { return; } memset(service, 0, lite_item_serviceid.value_length + 1); memcpy(service, lite_item_serviceid.value, lite_item_serviceid.value_length); if (linkkit_solo_ctx->user_callback->thing_call_service) { linkkit_solo_ctx->user_callback->thing_call_service(thing_id, (const char *)service, lite_item_id.value_int, linkkit_solo_ctx->user_context); } IMPL_SOLO_FREE(service); } break; case IOTX_DM_EVENT_LEGACY_THING_CREATED: { int res = 0; void *thing_id = NULL; if (payload == NULL || lite_item_devid.type != cJSON_Number) { return; } impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } if (linkkit_solo_ctx->user_callback->thing_create) { linkkit_solo_ctx->user_callback->thing_create(thing_id, linkkit_solo_ctx->user_context); } } break; case IOTX_DM_EVENT_THING_DISABLE: { int res = 0; void *thing_id = NULL; if (payload == NULL || lite_item_devid.type != cJSON_Number) { return; } impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } if (linkkit_solo_ctx->user_callback->thing_disable) { linkkit_solo_ctx->user_callback->thing_disable(thing_id, linkkit_solo_ctx->user_context); } } break; case IOTX_DM_EVENT_THING_ENABLE: { int res = 0; void *thing_id = NULL; if (payload == NULL || lite_item_devid.type != cJSON_Number) { return; } impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } if (linkkit_solo_ctx->user_callback->thing_enable) { linkkit_solo_ctx->user_callback->thing_enable(thing_id, linkkit_solo_ctx->user_context); } } break; case IOTX_DM_EVENT_PROPERTY_SET: { int res = 0; void *thing_id = NULL; char *propertyid = NULL; if (payload == NULL || lite_item_devid.type != cJSON_Number || lite_item_propertyid.type != cJSON_String) { return; } impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); impl_solo_debug("Current PropertyID: %.*s", lite_item_propertyid.value_length, lite_item_propertyid.value); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } propertyid = IMPL_SOLO_MALLOC(lite_item_propertyid.value_length + 1); if (propertyid == NULL) { return; } memset(propertyid, 0, lite_item_propertyid.value_length + 1); memcpy(propertyid, lite_item_propertyid.value, lite_item_propertyid.value_length); if (linkkit_solo_ctx->user_callback->thing_prop_changed) { linkkit_solo_ctx->user_callback->thing_prop_changed(thing_id, propertyid, linkkit_solo_ctx->user_context); } IMPL_SOLO_FREE(propertyid); } break; case IOTX_DM_EVENT_EVENT_PROPERTY_POST_REPLY: { int res = 0; void *thing_id = NULL; linkkit_solo_upstream_callback_node_t *node = NULL; handle_post_cb_fp_t callback = NULL; if (payload == NULL || lite_item_id.type != cJSON_Number || lite_item_code.type != cJSON_Number || lite_item_devid.type != cJSON_Number) { return; } impl_solo_debug("Current Id: %d", lite_item_id.value_int); impl_solo_debug("Current Code: %d", lite_item_code.value_int); impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } _linkkit_solo_upstream_mutex_lock(); res = _linkkit_solo_upstream_callback_list_search(lite_item_id.value_int, &node); if (res == SUCCESS_RETURN) { callback = node->callback; } _linkkit_solo_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (callback) { callback(thing_id, lite_item_id.value_int, lite_item_code.value_int, NULL, linkkit_solo_ctx->user_context); } _linkkit_solo_upstream_mutex_lock(); _linkkit_solo_upstream_callback_list_remove(lite_item_id.value_int); _linkkit_solo_upstream_mutex_unlock(); } } break; case IOTX_DM_EVENT_EVENT_SPECIFIC_POST_REPLY: { int res = 0; void *thing_id = NULL; linkkit_solo_upstream_callback_node_t *node = NULL; handle_post_cb_fp_t callback = NULL; if (payload == NULL || lite_item_id.type != cJSON_Number || lite_item_code.type != cJSON_Number || lite_item_devid.type != cJSON_Number || lite_item_eventid.type != cJSON_String) { return; } impl_solo_debug("Current Id: %d", lite_item_id.value_int); impl_solo_debug("Current Code: %d", lite_item_code.value_int); impl_solo_debug("Current Devid: %d", lite_item_devid.value_int); impl_solo_debug("Current EventID: %.*s", lite_item_eventid.value_length, lite_item_eventid.value); res = iotx_dm_deprecated_legacy_get_thingid_by_devid(lite_item_devid.value_int, &thing_id); if (res != SUCCESS_RETURN) { return; } _linkkit_solo_upstream_mutex_lock(); res = _linkkit_solo_upstream_callback_list_search(lite_item_id.value_int, &node); if (res == SUCCESS_RETURN) { callback = node->callback; } _linkkit_solo_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (callback) { callback(thing_id, lite_item_id.value_int, lite_item_code.value_int, NULL, linkkit_solo_ctx->user_context); } _linkkit_solo_upstream_mutex_lock(); _linkkit_solo_upstream_callback_list_remove(lite_item_id.value_int); _linkkit_solo_upstream_mutex_unlock(); } } break; case IOTX_DM_EVENT_COTA_NEW_CONFIG: { char *config_id = NULL, *get_type = NULL, *sign = NULL, *sign_method = NULL, *url = NULL; if (payload == NULL || lite_item_configid.type != cJSON_String || lite_item_configsize.type != cJSON_Number || lite_item_gettype.type != cJSON_String || lite_item_sign.type != cJSON_String || lite_item_signmethod.type != cJSON_String || lite_item_url.type != cJSON_String) { return; } impl_solo_debug("Current Config ID: %.*s", lite_item_configid.value_length, lite_item_configid.value); impl_solo_debug("Current Config Size: %d", lite_item_configsize.value_int); impl_solo_debug("Current Get Type: %.*s", lite_item_gettype.value_length, lite_item_gettype.value); impl_solo_debug("Current Sign: %.*s", lite_item_sign.value_length, lite_item_sign.value); impl_solo_debug("Current Sign Method: %.*s", lite_item_signmethod.value_length, lite_item_signmethod.value); impl_solo_debug("Current URL: %.*s", lite_item_url.value_length, lite_item_url.value); _impl_copy(lite_item_configid.value, lite_item_configid.value_length, (void **)&config_id, lite_item_configid.value_length + 1); _impl_copy(lite_item_gettype.value, lite_item_gettype.value_length, (void **)&get_type, lite_item_gettype.value_length + 1); _impl_copy(lite_item_sign.value, lite_item_sign.value_length, (void **)&sign, lite_item_sign.value_length + 1); _impl_copy(lite_item_signmethod.value, lite_item_signmethod.value_length, (void **)&sign_method, lite_item_signmethod.value_length + 1); _impl_copy(lite_item_url.value, lite_item_url.value_length, (void **)&url, lite_item_url.value_length + 1); if (config_id == NULL || get_type == NULL || sign == NULL || sign_method == NULL || url == NULL) { if (config_id) { IMPL_SOLO_FREE(config_id); } if (get_type) { IMPL_SOLO_FREE(get_type); } if (sign) { IMPL_SOLO_FREE(sign); } if (sign_method) { IMPL_SOLO_FREE(sign_method); } if (url) { IMPL_SOLO_FREE(url); } return; } if (linkkit_solo_ctx->cota_callback) { linkkit_solo_ctx->cota_callback(service_cota_callback_type_new_version_detected, config_id, lite_item_configsize.value_int, get_type, sign, sign_method, url); } if (config_id) { IMPL_SOLO_FREE(config_id); } if (get_type) { IMPL_SOLO_FREE(get_type); } if (sign) { IMPL_SOLO_FREE(sign); } if (sign_method) { IMPL_SOLO_FREE(sign_method); } if (url) { IMPL_SOLO_FREE(url); } } break; case IOTX_DM_EVENT_FOTA_NEW_FIRMWARE: { char *version = NULL; if (payload == NULL || lite_item_version.type != cJSON_String) { return; } impl_solo_debug("Current Firmware Version: %.*s", lite_item_version.value_length, lite_item_version.value); _impl_copy(lite_item_version.value, lite_item_version.value_length, (void **)&version, lite_item_version.value_length + 1); if (version == NULL) { return; } if (linkkit_solo_ctx->fota_callback) { linkkit_solo_ctx->fota_callback(service_fota_callback_type_new_version_detected, version); } if (version) { IMPL_SOLO_FREE(version); } } break; #ifdef LOCAL_CONN_ENABLE case IOTX_DM_EVENT_LOCAL_CONNECTED: { if (linkkit_solo_ctx->on_connect) { linkkit_solo_ctx->on_connect(context, 0); } } break; case IOTX_DM_EVENT_LOCAL_DISCONNECT: { if (linkkit_solo_ctx->on_connect) { linkkit_solo_ctx->on_connect(context, 0); } } break; #endif default: break; } } int being_deprecated linkkit_start(int max_buffered_msg, int get_tsl_from_cloud, linkkit_loglevel_t log_level, linkkit_ops_t *ops, linkkit_cloud_domain_type_t domain_type, void *user_context) { int res = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); iotx_dm_init_params_t dm_init_params; if (linkkit_solo_ctx->is_started == 1) { return FAIL_RETURN; } linkkit_solo_ctx->is_started = 1; if (max_buffered_msg <= 0 || ops == NULL || log_level > LOG_DEBUG_LEVEL || domain_type >= linkkit_cloud_domain_max) { impl_solo_err("Invalid Parameter"); linkkit_solo_ctx->is_started = 0; return FAIL_RETURN; } /* Create Mutex */ linkkit_solo_ctx->mutex = HAL_MutexCreate(); if (linkkit_solo_ctx->mutex == NULL) { linkkit_solo_ctx->is_started = 0; return FAIL_RETURN; } linkkit_solo_ctx->upstream_mutex = HAL_MutexCreate(); if (linkkit_solo_ctx->upstream_mutex == NULL) { HAL_MutexDestroy(linkkit_solo_ctx->mutex); linkkit_solo_ctx->is_started = 0; return FAIL_RETURN; } /* Set Linkkit Log Level */ IOT_SetLogLevel(log_level); /* Set Region */ IOT_Ioctl(IOTX_IOCTL_SET_REGION, &domain_type); /* 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_types_t)domain_type; dm_init_params.event_callback = _linkkit_solo_event_callback; res = iotx_dm_open(); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_solo_ctx->mutex); HAL_MutexDestroy(linkkit_solo_ctx->upstream_mutex); linkkit_solo_ctx->is_started = 0; return FAIL_RETURN; } res = iotx_dm_connect(&dm_init_params); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_solo_ctx->mutex); HAL_MutexDestroy(linkkit_solo_ctx->upstream_mutex); iotx_dm_close(); linkkit_solo_ctx->is_started = 0; return FAIL_RETURN; } res = iotx_dm_subscribe(IOTX_DM_LOCAL_NODE_DEVID); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_solo_ctx->mutex); HAL_MutexDestroy(linkkit_solo_ctx->upstream_mutex); iotx_dm_close(); linkkit_solo_ctx->is_started = 0; return FAIL_RETURN; } /* Get TSL From Cloud If Need */ if (get_tsl_from_cloud != 0) { res = iotx_dm_deprecated_set_tsl(IOTX_DM_LOCAL_NODE_DEVID, IOTX_DM_TSL_SOURCE_CLOUD, NULL, 0); if (res < SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_solo_ctx->mutex); HAL_MutexDestroy(linkkit_solo_ctx->upstream_mutex); iotx_dm_close(); linkkit_solo_ctx->is_started = 0; return FAIL_RETURN; } } /* Init Message Callback List */ INIT_LIST_HEAD(&linkkit_solo_ctx->callback_list); linkkit_solo_ctx->user_callback = ops; linkkit_solo_ctx->user_context = user_context; linkkit_solo_ctx->is_leaved = 0; return SUCCESS_RETURN; } int being_deprecated linkkit_end(void) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); _linkkit_solo_upstream_mutex_lock(); linkkit_solo_ctx->is_started = 0; _linkkit_solo_upstream_callback_list_destroy(); _linkkit_solo_upstream_mutex_unlock(); iotx_dm_close(); _linkkit_solo_mutex_unlock(); HAL_MutexDestroy(linkkit_solo_ctx->upstream_mutex); HAL_MutexDestroy(linkkit_solo_ctx->mutex); linkkit_solo_ctx->mutex = NULL; linkkit_solo_ctx->upstream_mutex = NULL; linkkit_solo_ctx->user_callback = NULL; linkkit_solo_ctx->user_context = NULL; linkkit_solo_ctx->cota_callback = NULL; linkkit_solo_ctx->fota_callback = NULL; INIT_LIST_HEAD(&linkkit_solo_ctx->callback_list); return SUCCESS_RETURN; } void *linkkit_set_tsl(const char *tsl, int tsl_len) { int res = 0; void *thing_id = NULL; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (tsl == NULL || tsl_len <= 0) { impl_solo_err("Invalid Parameter"); return NULL; } if (linkkit_solo_ctx->is_started == 0) { return NULL; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_set_tsl(IOTX_DM_LOCAL_NODE_DEVID, IOTX_DM_TSL_SOURCE_LOCAL, tsl, tsl_len); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return NULL; } res = iotx_dm_deprecated_legacy_get_thingid_by_devid(IOTX_DM_LOCAL_NODE_DEVID, &thing_id); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return NULL; } _linkkit_solo_mutex_unlock(); return thing_id; } int being_deprecated linkkit_set_value(linkkit_method_set_t method_set, const void *thing_id, const char *identifier, const void *value, const char *value_str) { int res = 0, devid = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (thing_id == NULL || identifier == NULL || (value == NULL && value_str == NULL)) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_thingid((void *)thing_id, &devid); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } switch (method_set) { case linkkit_method_set_property_value: { res = iotx_dm_deprecated_legacy_set_property_value(devid, (char *)identifier, strlen(identifier), (void *)value, (char *)value_str); } break; case linkkit_method_set_event_output_value: { res = iotx_dm_deprecated_legacy_set_event_output_value(devid, (char *)identifier, strlen(identifier), (void *)value, (char *)value_str); } break; case linkkit_method_set_service_output_value: { res = iotx_dm_deprecated_legacy_set_service_output_value(devid, (char *)identifier, strlen(identifier), (void *)value, (char *)value_str); } break; default: { impl_solo_err("Invalid Parameter"); res = FAIL_RETURN; } break; } if (res < SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } _linkkit_solo_mutex_unlock(); return SUCCESS_RETURN; } int being_deprecated linkkit_get_value(linkkit_method_get_t method_get, const void *thing_id, const char *identifier, void *value, char **value_str) { int res = 0, devid = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (thing_id == NULL || identifier == NULL || (value == NULL && value_str == NULL)) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_thingid((void *)thing_id, &devid); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } switch (method_get) { case linkkit_method_get_property_value: { res = iotx_dm_deprecated_legacy_get_property_value(devid, (char *)identifier, strlen(identifier), value, value_str); } break; case linkkit_method_get_event_output_value: { res = iotx_dm_deprecated_legacy_get_event_output_value(devid, (char *)identifier, strlen(identifier), value, value_str); } break; case linkkit_method_get_service_input_value: { res = iotx_dm_deprecated_legacy_get_service_input_value(devid, (char *)identifier, strlen(identifier), value, value_str); } break; case linkkit_method_get_service_output_value: { res = iotx_dm_deprecated_legacy_get_service_output_value(devid, (char *)identifier, strlen(identifier), value, value_str); } break; default: { impl_solo_err("Invalid Parameter"); res = FAIL_RETURN; } break; } if (res < SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } _linkkit_solo_mutex_unlock(); return SUCCESS_RETURN; } int being_deprecated linkkit_answer_service(const void *thing_id, const char *service_identifier, int response_id, int code) { int res = 0, devid = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (thing_id == NULL || service_identifier == NULL) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_thingid((void *)thing_id, &devid); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } res = iotx_dm_deprecated_send_service_response(devid, response_id, (iotx_dm_error_code_t)code, (char *)service_identifier, strlen(service_identifier)); if (res < SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } _linkkit_solo_mutex_unlock(); return SUCCESS_RETURN; } int being_deprecated linkkit_invoke_raw_service(const void *thing_id, int is_up_raw, void *raw_data, int raw_data_length) { int res = 0, devid = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (thing_id == NULL || raw_data == NULL || raw_data_length <= 0) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_thingid((void *)thing_id, &devid); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } res = iotx_dm_post_rawdata(devid, raw_data, raw_data_length); if (res < SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } _linkkit_solo_mutex_unlock(); return SUCCESS_RETURN; } int being_deprecated linkkit_trigger_extended_info_operate(const void *thing_id, const char *params, linkkit_extended_info_operate_t linkkit_extended_info_operation) { int res = 0, devid = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (thing_id == NULL || params == NULL) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_thingid((void *)thing_id, &devid); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } switch (linkkit_extended_info_operation) { case linkkit_extended_info_operate_update: { res = iotx_dm_deviceinfo_update(devid, (char *)params, strlen(params)); } break; case linkkit_extended_info_operate_delete: { res = iotx_dm_deviceinfo_delete(devid, (char *)params, strlen(params)); } break; default: { impl_solo_err("Invalid Parameter"); res = FAIL_RETURN; } break; } if (res < SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } _linkkit_solo_mutex_unlock(); return SUCCESS_RETURN; } int being_deprecated linkkit_trigger_event(const void *thing_id, const char *event_identifier, handle_post_cb_fp_t cb) { int res = 0, devid = 0, msgid = 0, post_event_reply = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (thing_id == NULL || event_identifier == NULL) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_thingid((void *)thing_id, &devid); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } res = iotx_dm_deprecated_post_event(devid, (char *)event_identifier, strlen((char *)event_identifier)); if (res < SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } msgid = res; res = iotx_dm_get_opt(linkkit_opt_event_post_reply, &post_event_reply); if (cb != NULL && post_event_reply) { /* Insert Message ID Into Linked List */ _linkkit_solo_upstream_mutex_lock(); res = _linkkit_solo_upstream_callback_list_insert(msgid, cb); _linkkit_solo_upstream_mutex_unlock(); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } } _linkkit_solo_mutex_unlock(); return SUCCESS_RETURN; } int being_deprecated linkkit_post_property(const void *thing_id, const char *property_identifier, handle_post_cb_fp_t cb) { int res = 0, devid = 0, msgid = 0, property_identifier_len = 0, post_property_reply = 0; void *property_handle = NULL; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (thing_id == NULL) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_thingid((void *)thing_id, &devid); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } res = iotx_dm_deprecated_post_property_start(devid, &property_handle); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } property_identifier_len = (property_identifier) ? (strlen((char *)property_identifier)) : (0); res = iotx_dm_deprecated_post_property_add(property_handle, (char *)property_identifier, property_identifier_len); if (res != SUCCESS_RETURN) { iotx_dm_deprecated_post_property_end(&property_handle); _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } res = iotx_dm_deprecated_post_property_end(&property_handle); if (res < SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } msgid = res; res = iotx_dm_get_opt(linkkit_opt_property_post_reply, &post_property_reply); if (cb != NULL && post_property_reply) { /* Insert Message ID Into Linked List */ _linkkit_solo_upstream_mutex_lock(); res = _linkkit_solo_upstream_callback_list_insert(msgid, cb); _linkkit_solo_upstream_mutex_unlock(); if (res != SUCCESS_RETURN) { _linkkit_solo_mutex_unlock(); return FAIL_RETURN; } } _linkkit_solo_mutex_unlock(); return SUCCESS_RETURN; } int being_deprecated linkkit_yield(int timeout_ms) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (timeout_ms <= 0) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } return iotx_dm_yield(timeout_ms); } int being_deprecated linkkit_cota_init(handle_service_cota_callback_fp_t callback_fp) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } linkkit_solo_ctx->cota_callback = callback_fp; return SUCCESS_RETURN; } int being_deprecated linkkit_invoke_cota_service(void *data_buf, int data_buf_length) { int res = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (data_buf == NULL || data_buf_length <= 0) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_cota_perform_sync(data_buf, data_buf_length); _linkkit_solo_mutex_unlock(); return res; } int being_deprecated linkkit_invoke_cota_get_config(const char *config_scope, const char *get_type, const char *attribute_Keys, void *option) { int res = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (config_scope == NULL || get_type == NULL || attribute_Keys == NULL) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_cota_get_config(config_scope, get_type, attribute_Keys); _linkkit_solo_mutex_unlock(); return res; } int being_deprecated linkkit_fota_init(handle_service_fota_callback_fp_t callback_fp) { linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } linkkit_solo_ctx->fota_callback = callback_fp; return SUCCESS_RETURN; } int being_deprecated linkkit_invoke_fota_service(void *data_buf, int data_buf_length) { int res = 0; linkkit_solo_legacy_ctx_t *linkkit_solo_ctx = _linkkit_solo_legacy_get_ctx(); if (data_buf == NULL || data_buf_length <= 0) { impl_solo_err("Invalid Parameter"); return FAIL_RETURN; } if (linkkit_solo_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_solo_mutex_lock(); res = iotx_dm_fota_perform_sync(data_buf, data_buf_length); _linkkit_solo_mutex_unlock(); return res; } #endif