Commit 3ee908ac authored by chen.weican's avatar chen.weican

【修改内容】1,修改有可能出现子设备的topic没有订阅的问题;2,代码优化

【提交人】陈伟灿
parent b7d58b33
...@@ -188,11 +188,14 @@ void iotx_dm_dispatch(void) ...@@ -188,11 +188,14 @@ void iotx_dm_dispatch(void)
if (ctx->event_callback) { if (ctx->event_callback) {
ctx->event_callback(1, data); ctx->event_callback(1, data);
} }
free(data); free(data);
data = NULL; data = NULL;
} else { }else if(kk_get_cloudstatus()&&dm_queue_msg_next4(&data) == SUCCESS_RETURN){
kk_ipc_send(IPC_MID2APP, data, strlen(data));
free(data);
data = NULL;
}
else {
break; break;
} }
} }
...@@ -324,8 +327,12 @@ int iotx_dm_subscribe(_IN_ int devid) ...@@ -324,8 +327,12 @@ int iotx_dm_subscribe(_IN_ int devid)
if (buf){ if (buf){
HAL_Snprintf(buf, len, subscribe_cmd, node->productCode,node->deviceCode); HAL_Snprintf(buf, len, subscribe_cmd, node->productCode,node->deviceCode);
#if 0
kk_ipc_send(IPC_MID2APP, buf, len); kk_ipc_send(IPC_MID2APP, buf, len);
free(buf); free(buf);
#else
dm_queue_msg_insert4(buf);
#endif
}else{ }else{
ERROR_PRINT("\n [%d][%s] malloc faild kk_ipc_send \n", __LINE__, __FUNCTION__); ERROR_PRINT("\n [%d][%s] malloc faild kk_ipc_send \n", __LINE__, __FUNCTION__);
......
...@@ -39,6 +39,13 @@ static void _dm_queue_lock3(void) ...@@ -39,6 +39,13 @@ static void _dm_queue_lock3(void)
} }
} }
static void _dm_queue_lock4(void)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
if (ctx->mutex4) {
HAL_MutexLock(ctx->mutex4);
}
}
static void _dm_queue_unlock(void) static void _dm_queue_unlock(void)
...@@ -63,6 +70,13 @@ static void _dm_queue_unlock3(void) ...@@ -63,6 +70,13 @@ static void _dm_queue_unlock3(void)
HAL_MutexUnlock(ctx->mutex3); HAL_MutexUnlock(ctx->mutex3);
} }
} }
static void _dm_queue_unlock4(void)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
if (ctx->mutex4) {
HAL_MutexUnlock(ctx->mutex4);
}
}
...@@ -90,6 +104,12 @@ int dm_queue_init(int max_size) ...@@ -90,6 +104,12 @@ int dm_queue_init(int max_size)
return INVALID_PARAMETER; return INVALID_PARAMETER;
} }
/* Create Mutex */
ctx->mutex4 = HAL_MutexCreate();
if (ctx->mutex4 == NULL) {
return INVALID_PARAMETER;
}
/* Init List */ /* Init List */
ctx->msg_list.max_size = max_size; ctx->msg_list.max_size = max_size;
INIT_LIST_HEAD(&ctx->msg_list.message_list); INIT_LIST_HEAD(&ctx->msg_list.message_list);
...@@ -97,6 +117,8 @@ int dm_queue_init(int max_size) ...@@ -97,6 +117,8 @@ int dm_queue_init(int max_size)
INIT_LIST_HEAD(&ctx->msg_list2.message_list); INIT_LIST_HEAD(&ctx->msg_list2.message_list);
ctx->msg_list3.max_size = max_size; ctx->msg_list3.max_size = max_size;
INIT_LIST_HEAD(&ctx->msg_list3.message_list); INIT_LIST_HEAD(&ctx->msg_list3.message_list);
ctx->msg_list4.max_size = max_size;
INIT_LIST_HEAD(&ctx->msg_list4.message_list);
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
...@@ -116,6 +138,14 @@ void dm_queue_deinit(void) ...@@ -116,6 +138,14 @@ void dm_queue_deinit(void)
HAL_MutexDestroy(ctx->mutex2); HAL_MutexDestroy(ctx->mutex2);
} }
if (ctx->mutex3) {
HAL_MutexDestroy(ctx->mutex3);
}
if (ctx->mutex4) {
HAL_MutexDestroy(ctx->mutex4);
}
list_for_each_entry_safe(del_node, next_node, &ctx->msg_list.message_list, linked_list, dm_queue_msg_node_t) { list_for_each_entry_safe(del_node, next_node, &ctx->msg_list.message_list, linked_list, dm_queue_msg_node_t) {
/* Free Message */ /* Free Message */
del_msg = (dm_queue_msg_t *)del_node->data; del_msg = (dm_queue_msg_t *)del_node->data;
...@@ -163,6 +193,23 @@ void dm_queue_deinit(void) ...@@ -163,6 +193,23 @@ void dm_queue_deinit(void)
list_del(&del_node->linked_list); list_del(&del_node->linked_list);
free(del_node); free(del_node);
} }
del_node = NULL;
next_node = NULL;
del_msg = NULL;
list_for_each_entry_safe(del_node, next_node, &ctx->msg_list4.message_list, linked_list, dm_queue_msg_node_t) {
/* Free Message */
del_msg = (dm_queue_msg_t *)del_node->data;
if (del_msg->data) {
free(del_msg->data);
}
free(del_msg);
del_msg = NULL;
/* Free Node */
list_del(&del_node->linked_list);
free(del_node);
}
} }
...@@ -348,4 +395,63 @@ int dm_queue_msg_next3(void **data) ...@@ -348,4 +395,63 @@ int dm_queue_msg_next3(void **data)
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
int dm_queue_msg_insert4(void *data)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
dm_queue_msg_node_t *node = NULL;
if (data == NULL) {
return INVALID_PARAMETER;
}
_dm_queue_lock4();
printf("dm msg list size: %d, max size: %d", ctx->msg_list4.size, ctx->msg_list4.max_size);
if (ctx->msg_list4.size >= ctx->msg_list4.max_size) {
printf("dm queue list full");
_dm_queue_unlock4();
return FAIL_RETURN;
}
node = malloc(sizeof(dm_queue_msg_node_t));
if (node == NULL) {
_dm_queue_unlock4();
return MEMORY_NOT_ENOUGH;
}
memset(node, 0, sizeof(dm_queue_msg_node_t));
node->data = data;
INIT_LIST_HEAD(&node->linked_list);
ctx->msg_list4.size++;
list_add_tail(&node->linked_list, &ctx->msg_list4.message_list);
_dm_queue_unlock4();
return SUCCESS_RETURN;
}
int dm_queue_msg_next4(void **data)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
dm_queue_msg_node_t *node = NULL;
if (data == NULL || *data != NULL) {
return INVALID_PARAMETER;
}
_dm_queue_lock4();
if (list_empty(&ctx->msg_list4.message_list)) {
_dm_queue_unlock4();
return FAIL_RETURN;
}
node = list_first_entry(&ctx->msg_list4.message_list, dm_queue_msg_node_t, linked_list);
list_del(&node->linked_list);
ctx->msg_list4.size--;
*data = node->data;
free(node);
_dm_queue_unlock4();
return SUCCESS_RETURN;
}
...@@ -31,9 +31,11 @@ typedef struct { ...@@ -31,9 +31,11 @@ typedef struct {
void *mutex; void *mutex;
void *mutex2; void *mutex2;
void *mutex3; void *mutex3;
void *mutex4;
dm_queue_msg_list_t msg_list; dm_queue_msg_list_t msg_list;
dm_queue_msg_list_t msg_list2; dm_queue_msg_list_t msg_list2;
dm_queue_msg_list_t msg_list3; dm_queue_msg_list_t msg_list3;
dm_queue_msg_list_t msg_list4;
} dm_queue_t; } dm_queue_t;
int dm_queue_init(int max_size); int dm_queue_init(int max_size);
......
...@@ -224,7 +224,10 @@ static void _iotx_linkkit_upstream_callback_remove(int msgid, int code) ...@@ -224,7 +224,10 @@ static void _iotx_linkkit_upstream_callback_remove(int msgid, int code)
#ifdef ALCS_ENABLED #ifdef ALCS_ENABLED
extern void dm_server_free_context(_IN_ void *ctx); extern void dm_server_free_context(_IN_ void *ctx);
#endif #endif
static int s_CloudStatus = 0;
int kk_get_cloudstatus(void){
return s_CloudStatus;
}
static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data) static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
{ {
INFO_PRINT("_iotx_linkkit_event_callback ================== [%s]\n",data); INFO_PRINT("_iotx_linkkit_event_callback ================== [%s]\n",data);
...@@ -293,21 +296,23 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data) ...@@ -293,21 +296,23 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
}else if (strstr(typeJson->valuestring,KK_THING_CLOUDSTATE_MSG)){ }else if (strstr(typeJson->valuestring,KK_THING_CLOUDSTATE_MSG)){
INFO_PRINT("cloud state notify \n"); INFO_PRINT("cloud state notify \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR); cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *state = cJSON_GetObjectItem(paramStr, "IOTCloudState"); cJSON *state = cJSON_GetObjectItem(paramStr, MSG_IOTClOUDSTATE_STR);
int state_int = atoi(state->valuestring); s_CloudStatus = atoi(state->valuestring);
res = kk_tsl_set_value(kk_tsl_set_property_value,0,KK_TSL_CCU_WANSTATE_IDENTIFIER,&state_int,NULL); res = kk_tsl_set_value(kk_tsl_set_property_value,0,KK_TSL_CCU_WANSTATE_IDENTIFIER,&s_CloudStatus,NULL);
if(res != SUCCESS_RETURN) if(res != SUCCESS_RETURN)
{ {
ERROR_PRINT("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res); ERROR_PRINT("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
} }
res = kk_tsl_set_value(kk_tsl_set_property_value,0,KK_TSL_CCU_IOTCLOUD_IDENTIFIER,&state_int,NULL); res = kk_tsl_set_value(kk_tsl_set_property_value,0,KK_TSL_CCU_IOTCLOUD_IDENTIFIER,&s_CloudStatus,NULL);
if(res != SUCCESS_RETURN) if(res != SUCCESS_RETURN)
{ {
ERROR_PRINT("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res); ERROR_PRINT("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
} }
if(s_CloudStatus){
iotx_dm_dev_online(0);//first online,report the online status iotx_dm_dev_online(0);//first online,report the online status
usleep(200000); usleep(200000);
kk_tsl_post_property(0,NULL); kk_tsl_post_property(0,NULL);
}
}else if (strstr(typeJson->valuestring,KK_THING_OTA_DEVICE_UPGRADE)){ }else if (strstr(typeJson->valuestring,KK_THING_OTA_DEVICE_UPGRADE)){
INFO_PRINT("ota upgrade... \n"); INFO_PRINT("ota upgrade... \n");
kk_dm_ota_send(data, strlen(data)+1); kk_dm_ota_send(data, strlen(data)+1);
......
...@@ -237,7 +237,7 @@ int kk_subDev_update_offline(int isOffline,const char *deviceCode) ...@@ -237,7 +237,7 @@ int kk_subDev_update_offline(int isOffline,const char *deviceCode)
kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx(); kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx();
_kk_subDb_lock(); _kk_subDb_lock();
sqlCmd = sqlite3_mprintf("UPDATE SubDeviceInfo SET isOffline=%d WHERE deviceCode=%s",isOffline,deviceCode); sqlCmd = sqlite3_mprintf("UPDATE SubDeviceInfo SET isOffline=%d WHERE deviceCode= '%s'",isOffline,deviceCode);
INFO_PRINT("kk_subDev_update_offline sqlCmd:%s\n",sqlCmd); INFO_PRINT("kk_subDev_update_offline sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg); rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){ if( rc != SQLITE_OK ){
...@@ -259,7 +259,7 @@ int kk_subDev_update_auth(int isAuth,const char *deviceCode) ...@@ -259,7 +259,7 @@ int kk_subDev_update_auth(int isAuth,const char *deviceCode)
kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx(); kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx();
_kk_subDb_lock(); _kk_subDb_lock();
sqlCmd = sqlite3_mprintf("UPDATE SubDeviceInfo SET isAuth=%d WHERE deviceCode=%s",isAuth,deviceCode); sqlCmd = sqlite3_mprintf("UPDATE SubDeviceInfo SET isAuth=%d WHERE deviceCode= '%s'",isAuth,deviceCode);
INFO_PRINT("kk_subDev_update_auth sqlCmd:%s\n",sqlCmd); INFO_PRINT("kk_subDev_update_auth sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg); rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){ if( rc != SQLITE_OK ){
......
...@@ -560,10 +560,8 @@ void *ccu_property_monitor(void *args) ...@@ -560,10 +560,8 @@ void *ccu_property_monitor(void *args)
char *s_IP_TSL = NULL; char *s_IP_TSL = NULL;
int res = 0; int res = 0;
int needReport = 0; int needReport = 0;
static int s_cloudStatus = 0;
int cloudState = 0;
int time_second = 60; int time_second = 60;
static int alreadyRepord = 0;
while (mid_ctx->g_ccuProChg_dispatch_thread_running) { while (mid_ctx->g_ccuProChg_dispatch_thread_running) {
//dm_ota_yield(MID_YIELD_TIMEOUT_MS); //dm_ota_yield(MID_YIELD_TIMEOUT_MS);
HAL_Get_IP(s_IP,NULL); HAL_Get_IP(s_IP,NULL);
...@@ -578,30 +576,12 @@ void *ccu_property_monitor(void *args) ...@@ -578,30 +576,12 @@ void *ccu_property_monitor(void *args)
needReport = 1; needReport = 1;
} }
} }
res = kk_tsl_get_value(kk_tsl_get_property_value,0,KK_TSL_CCU_IOTCLOUD_IDENTIFIER,&cloudState,NULL); if(needReport&&(kk_get_cloudstatus() == 1)){
if(res != SUCCESS_RETURN){
ERROR_PRINT("kk_tsl_get_value Failed\n");
}
else{
if(s_cloudStatus == cloudState){
}else{
s_cloudStatus = cloudState;
INFO_PRINT("cloudState:%d,s_cloudStatus:%d\n",cloudState,s_cloudStatus);
needReport = 1;
}
}
if(needReport&&(cloudState == 1)){
//kk_tsl_post_property(0,NULL);
needReport = 0; needReport = 0;
kk_tsl_post_property(0,NULL); kk_tsl_post_property(0,NULL);
} }
INFO_PRINT("time_second:%d,s_cloudStatus:%d\n",time_second,s_cloudStatus);
sleep(time_second); sleep(time_second);
} }
return NULL; return NULL;
} }
...@@ -631,18 +611,6 @@ int main(const int argc, const char **argv) ...@@ -631,18 +611,6 @@ int main(const int argc, const char **argv)
kk_ipc_init(IPC_MID2APP, mid_cb, NULL, NULL); kk_ipc_init(IPC_MID2APP, mid_cb, NULL, NULL);
kk_ipc_init(IPC_MID2PLAT, mid2p_cb, NULL, "*"); kk_ipc_init(IPC_MID2PLAT, mid2p_cb, NULL, "*");
//DB_Init();
//test_tcp();
/* when Connect to app and platfrom */
/*do {
res = IOT_Linkkit_Connect(user_example_ctx->master_devid);
if (res < 0) {
EXAMPLE_TRACE("IOT_Linkkit_Connect failed, retry after 5s...\n");
HAL_SleepMs(5000);
}
} while (res < 0);*/
kk_init_dmproc(); kk_init_dmproc();
kk_subDb_init(); kk_subDb_init();
kk_heartbeat_init(); kk_heartbeat_init();
......
...@@ -65,7 +65,7 @@ typedef struct{ ...@@ -65,7 +65,7 @@ typedef struct{
void kk_rpc_reportLeftDevices(EmberEUI64 mac) void kk_rpc_reportLeftDevices(EmberEUI64 mac)
{ {
cJSON* devicesJson; cJSON* devicesJson;
EmberEUI64 testMac = {0x4A,0x83,0xD3,0xFE,0xFF,0x81,0x8E,0x58}; //EmberEUI64 testMac = {0x4A,0x83,0xD3,0xFE,0xFF,0x81,0x8E,0x58};
EmberEUI64 testMac_GW = {0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11}; EmberEUI64 testMac_GW = {0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11};
char macString[RPC_EUI64_STRING_LENGTH]; char macString[RPC_EUI64_STRING_LENGTH];
...@@ -92,15 +92,16 @@ int kk_sendData2CCU(char* data, int len){ ...@@ -92,15 +92,16 @@ int kk_sendData2CCU(char* data, int len){
void kk_rpc_reportDevices(EmberEUI64 mac) void kk_rpc_reportDevices(EmberEUI64 mac)
{ {
cJSON* devicesJson; cJSON* devicesJson;
EmberEUI64 testMac = {0x4A,0x83,0xD3,0xFE,0xFF,0x81,0x8E,0x58}; //EmberEUI64 testMac = {0x4A,0x83,0xD3,0xFE,0xFF,0x81,0x8E,0x58};
EmberEUI64 testMac_GW = {0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11}; EmberEUI64 testMac_GW = {0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11};
char macString[19] = {0};
devicesJson = rpc_cJSON_CreateObject(); devicesJson = rpc_cJSON_CreateObject();
rpc_eui64ToString(mac,macString);
rpc_cJSON_AddStringToObject(devicesJson, "productCode",TEST_PRODUCT_CODE); rpc_cJSON_AddStringToObject(devicesJson, "productCode",TEST_PRODUCT_CODE);
rpc_cJSON_AddStringToObject(devicesJson, "deviceCode","588E81FFFED3834A"); rpc_cJSON_AddStringToObject(devicesJson, "deviceCode",macString);
rpc_cJSON_AddStringToObject(devicesJson, "mac","588E81FFFED3834A"); rpc_cJSON_AddStringToObject(devicesJson, "mac",macString);
kk_sub_tsl_add(testMac,TEST_PRODUCT_CODE); kk_sub_tsl_add(mac,TEST_PRODUCT_CODE);
kk_rpc_report_devices(devicesJson,testMac_GW); kk_rpc_report_devices(devicesJson,testMac_GW);
} }
int kk_rpc_report_LightStatus(EmberEUI64 mac,int status,uint16_t clusterId,uint16_t attributeId) int kk_rpc_report_LightStatus(EmberEUI64 mac,int status,uint16_t clusterId,uint16_t attributeId)
...@@ -390,7 +391,7 @@ void emberAfPluginDeviceTableNewDeviceCallback(EmberEUI64 nodeEui64) ...@@ -390,7 +391,7 @@ void emberAfPluginDeviceTableNewDeviceCallback(EmberEUI64 nodeEui64)
return ; return ;
} }
//EmberAfPluginDeviceTableEntry *deviceTable = emberAfDeviceTablePointer(); EmberAfPluginDeviceTableEntry *deviceTable = emberAfDeviceTablePointer();
//cJSON* nodeJson = rpc_reportDeviceState("joined",deviceTable[deviceTableIndex].eui64); //cJSON* nodeJson = rpc_reportDeviceState("joined",deviceTable[deviceTableIndex].eui64);
//rpc_printfJSON("joined",nodeJson); //rpc_printfJSON("joined",nodeJson);
...@@ -402,6 +403,6 @@ void emberAfPluginDeviceTableNewDeviceCallback(EmberEUI64 nodeEui64) ...@@ -402,6 +403,6 @@ void emberAfPluginDeviceTableNewDeviceCallback(EmberEUI64 nodeEui64)
//device.mac = nodeEui64; //device.mac = nodeEui64;
//device.AppVersion = 0x10; //device.AppVersion = 0x10;
//memcpy(device.mac,nodeEui64,EUI64_SIZE); //memcpy(device.mac,nodeEui64,EUI64_SIZE);
kk_rpc_reportDevices(nodeEui64); kk_rpc_reportDevices(deviceTable[deviceTableIndex].eui64);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment