Files

1187 lines
41 KiB
C

/*
* 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